Skip to content

Commit 4ce8850

Browse files
authored
Merge pull request #1164 from dnum-mi/develop
Develop
2 parents dd4ddd0 + 9aef0dd commit 4ce8850

File tree

4 files changed

+83
-58
lines changed

4 files changed

+83
-58
lines changed

.github/workflows/check-pr-linked-issue.yml

Lines changed: 71 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,76 +2,98 @@ name: Check PR linked to issue
22

33
on:
44
pull_request:
5-
types: [opened, edited, synchronize]
5+
types: [opened, edited, synchronize, reopened, ready_for_review]
6+
# Relancer quand une issue est fermée/ouverte (peut affecter les liaisons)
7+
issues:
8+
types: [opened, closed, reopened]
69

710
jobs:
811
check-linked-issue:
912
runs-on: ubuntu-latest
1013
# Exception : les PR de develop vers main n'ont pas besoin d'être liées à une issue
11-
if: github.head_ref != 'develop' || github.base_ref != 'main'
14+
if: (github.event_name == 'pull_request' && (github.head_ref != 'develop' || github.base_ref != 'main')) || github.event_name == 'issues'
1215
steps:
1316
- name: Check if PR is linked to an issue
1417
uses: actions/github-script@v7
1518
with:
1619
script: |
17-
const { data: pullRequest } = await github.rest.pulls.get({
18-
owner: context.repo.owner,
19-
repo: context.repo.repo,
20-
pull_number: context.issue.number,
21-
});
20+
let pullRequests = [];
2221
23-
// Vérifier les issues liées via l'interface GitHub avec GraphQL
24-
const query = `
25-
query($owner: String!, $repo: String!, $number: Int!) {
26-
repository(owner: $owner, name: $repo) {
27-
pullRequest(number: $number) {
28-
closingIssuesReferences(first: 50) {
29-
nodes {
30-
number
31-
title
22+
if (context.eventName === 'issues') {
23+
// Si l'événement vient d'une issue, vérifier toutes les PR ouvertes
24+
const { data: prs } = await github.rest.pulls.list({
25+
owner: context.repo.owner,
26+
repo: context.repo.repo,
27+
state: 'open'
28+
});
29+
pullRequests = prs.filter(pr => pr.head.ref !== 'develop' || pr.base.ref !== 'main');
30+
} else {
31+
// Événement normal de PR
32+
const { data: pullRequest } = await github.rest.pulls.get({
33+
owner: context.repo.owner,
34+
repo: context.repo.repo,
35+
pull_number: context.issue.number,
36+
});
37+
pullRequests = [pullRequest];
38+
}
39+
40+
for (const pullRequest of pullRequests) {
41+
console.log(`🔍 Vérification de la PR #${pullRequest.number}: ${pullRequest.title}`);
42+
43+
// Vérifier les issues liées via l'interface GitHub avec GraphQL
44+
const query = `
45+
query($owner: String!, $repo: String!, $number: Int!) {
46+
repository(owner: $owner, name: $repo) {
47+
pullRequest(number: $number) {
48+
closingIssuesReferences(first: 50) {
49+
nodes {
50+
number
51+
title
52+
}
3253
}
3354
}
3455
}
3556
}
36-
}
37-
`;
57+
`;
3858
39-
let linkedIssuesFromUI = [];
40-
try {
41-
const result = await github.graphql(query, {
42-
owner: context.repo.owner,
43-
repo: context.repo.repo,
44-
number: context.issue.number,
45-
});
46-
linkedIssuesFromUI = result.repository.pullRequest.closingIssuesReferences.nodes;
47-
} catch (error) {
48-
console.log('Erreur lors de la récupération des issues liées via GraphQL:', error.message);
49-
}
59+
let linkedIssuesFromUI = [];
60+
try {
61+
const result = await github.graphql(query, {
62+
owner: context.repo.owner,
63+
repo: context.repo.repo,
64+
number: pullRequest.number,
65+
});
66+
linkedIssuesFromUI = result.repository.pullRequest.closingIssuesReferences.nodes;
67+
} catch (error) {
68+
console.log('Erreur lors de la récupération des issues liées via GraphQL:', error.message);
69+
}
5070
51-
// Vérifier dans le corps de la PR (mots-clés comme "closes #123", "fixes #456")
52-
const prBody = pullRequest.body || '';
53-
const prTitle = pullRequest.title || '';
71+
// Vérifier dans le corps de la PR (mots-clés comme "closes #123", "fixes #456")
72+
const prBody = pullRequest.body || '';
73+
const prTitle = pullRequest.title || '';
5474
55-
// Pattern pour détecter les références aux issues
56-
const issueKeywords = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?|ref(?:erences?)?|see|relate[sd]?(?:\s+to)?)\s*(?:#(\d+)|https?:\/\/github\.com\/[^\/]+\/[^\/]+\/issues\/(\d+))/gi;
75+
// Pattern pour détecter les références aux issues
76+
const issueKeywords = /(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?|ref(?:erences?)?|see|relate[sd]?(?:\s+to)?)\s*(?:#(\d+)|https?:\/\/github\.com\/[^\/]+\/[^\/]+\/issues\/(\d+))/gi;
5777
58-
const bodyMatches = prBody.match(issueKeywords);
59-
const titleMatches = prTitle.match(issueKeywords);
78+
const bodyMatches = prBody.match(issueKeywords);
79+
const titleMatches = prTitle.match(issueKeywords);
6080
61-
// Vérifier aussi les numéros d'issues simples dans le titre (ex: "feat: #123 - nouvelle fonctionnalité")
62-
const simpleIssueRef = /(?:^|\s)#(\d+)(?:\s|$|-)/g;
63-
const titleIssueRefs = prTitle.match(simpleIssueRef);
81+
// Vérifier aussi les numéros d'issues simples dans le titre (ex: "feat: #123 - nouvelle fonctionnalité")
82+
const simpleIssueRef = /(?:^|\s)#(\d+)(?:\s|$|-)/g;
83+
const titleIssueRefs = prTitle.match(simpleIssueRef);
6484
65-
const hasLinkedIssues = linkedIssuesFromUI.length > 0 || bodyMatches || titleMatches || titleIssueRefs;
85+
const hasLinkedIssues = linkedIssuesFromUI.length > 0 || bodyMatches || titleMatches || titleIssueRefs;
6686
67-
if (!hasLinkedIssues) {
68-
core.setFailed('❌ Cette PR doit être liée à une issue. Utilisez des mots-clés comme "closes #123" ou "fixes #456" dans la description, référencez une issue dans le titre avec "#123", ou liez une issue via l\'interface GitHub.');
69-
} else {
70-
console.log('✅ PR correctement liée à une ou plusieurs issues');
71-
if (linkedIssuesFromUI.length > 0) {
72-
console.log('Issues liées via l\'interface GitHub:', linkedIssuesFromUI.map(issue => `#${issue.number} - ${issue.title}`));
87+
if (!hasLinkedIssues) {
88+
core.setFailed(`❌ La PR #${pullRequest.number} doit être liée à une issue. Utilisez des mots-clés comme "closes #123" ou "fixes #456" dans la description, référencez une issue dans le titre avec "#123", ou liez une issue via l'interface GitHub.`);
89+
break; // Arrêter au premier échec
90+
} else {
91+
console.log(`✅ PR #${pullRequest.number} correctement liée à une ou plusieurs issues`);
92+
if (linkedIssuesFromUI.length > 0) {
93+
console.log('Issues liées via l\'interface GitHub:', linkedIssuesFromUI.map(issue => `#${issue.number} - ${issue.title}`));
94+
}
95+
if (bodyMatches) console.log('Issues trouvées dans le body:', bodyMatches);
96+
if (titleMatches) console.log('Issues trouvées dans le titre:', titleMatches);
97+
if (titleIssueRefs) console.log('Références d\'issues dans le titre:', titleIssueRefs);
7398
}
74-
if (bodyMatches) console.log('Issues trouvées dans le body:', bodyMatches);
75-
if (titleMatches) console.log('Issues trouvées dans le titre:', titleMatches);
76-
if (titleIssueRefs) console.log('Références d\'issues dans le titre:', titleIssueRefs);
7799
}

src/components/DsfrCheckbox/DsfrCheckboxSet.vue

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<script lang="ts">
1+
<script lang="ts" setup>
22
import type { DsfrCheckboxSetProps } from './DsfrCheckbox.types'
33
44
import { computed } from 'vue'
@@ -8,9 +8,6 @@ import { useRandomId } from '../../utils/random-utils'
88
import DsfrCheckbox from './DsfrCheckbox.vue'
99
1010
export type { DsfrCheckboxSetProps }
11-
</script>
12-
13-
<script lang="ts" setup>
1411
const props = withDefaults(defineProps<DsfrCheckboxSetProps>(), {
1512
titleId: () => useRandomId('checkbox', 'set'),
1613
errorMessage: '',

src/components/DsfrTabs/DsfrTabItem.vue

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import VIcon from '../VIcon/VIcon.vue'
55
66
import { registerTabKey } from './injection-key'
77
8-
export type DsfrTabItemProps = {
9-
panelId: string
10-
tabId: string
11-
icon?: string
12-
}
8+
defineOptions({
9+
inheritAttrs: false,
10+
})
11+
1312
const props = withDefaults(defineProps<DsfrTabItemProps>(), {
1413
icon: undefined,
1514
})
@@ -32,6 +31,12 @@ defineSlots<{
3231
default?: () => any
3332
}>()
3433
34+
export type DsfrTabItemProps = {
35+
panelId: string
36+
tabId: string
37+
icon?: string
38+
}
39+
3540
const button = ref<HTMLButtonElement | null>(null)
3641
3742
const keyToEventDict = {

src/components/DsfrTooltip/DsfrTooltip.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ onUnmounted(() => {
155155
:class="onHover ? 'fr-link' : 'fr-btn fr-btn--tooltip'"
156156
:aria-describedby="id"
157157
:href="onHover ? '#' : undefined"
158+
:type="onHover ? undefined : 'button'"
158159
@click="onClick()"
159160
@mouseleave="onMouseLeave()"
160161
@focus="onMouseEnterHandler($event)"

0 commit comments

Comments
 (0)