@@ -9800,12 +9800,12 @@ const SEMANTIC_TYPE_TO_LABEL = {
9800
9800
};
9801
9801
9802
9802
/**
9803
- * Extract semantic commit type from a message
9803
+ * Extract semantic type from a PR title
9804
9804
* Supports formats like:
9805
9805
* - "feat: add new feature"
9806
9806
* - "fix(component): fix bug"
9807
9807
* - "chore: update dependencies"
9808
- * @param {string} message - The commit message or PR title
9808
+ * @param {string} message - The PR title
9809
9809
* @returns {string|null} - The semantic type or null if not found
9810
9810
*/
9811
9811
function extractSemanticType(message) {
@@ -9837,9 +9837,6 @@ async function run() {
9837
9837
const octokit = github.getOctokit(token);
9838
9838
core.debug("GitHub client initialized");
9839
9839
9840
- // Track if we added a label based on semantic commit
9841
- let addedSemanticLabel = false;
9842
-
9843
9840
// fetch the list of labels
9844
9841
core.debug("Fetching current PR labels...");
9845
9842
const labels = (
@@ -9850,102 +9847,16 @@ async function run() {
9850
9847
).data.map((label) => label.name);
9851
9848
core.debug(`Found ${labels.length} labels: ${labels.join(", ")}`);
9852
9849
9853
- // Get PR details to check for semantic commit messages
9854
- const prNumber = github.context.issue.number;
9855
- core.debug(`Processing PR #${prNumber}`);
9856
-
9857
- core.debug("Fetching PR details...");
9858
- const { data: pullRequest } = await octokit.rest.pulls.get({
9859
- ...github.context.repo,
9860
- pull_number: prNumber,
9861
- });
9862
-
9863
- // Get the PR title and HEAD commit message
9864
- const prTitle = pullRequest.title;
9865
- core.debug(`PR title: "${prTitle}"`);
9866
-
9867
- // Get the HEAD commit message
9868
- core.debug("Fetching PR commits...");
9869
- const { data: commits } = await octokit.rest.pulls.listCommits({
9870
- ...github.context.repo,
9871
- pull_number: prNumber,
9872
- });
9873
-
9874
- core.debug(`Found ${commits.length} commits in PR`);
9875
- const headCommitMessage = commits.length > 0 ? commits[commits.length - 1].commit.message : null;
9876
- if (headCommitMessage) {
9877
- core.debug(`HEAD commit message: "${headCommitMessage}"`);
9878
- } else {
9879
- core.debug("No HEAD commit message found");
9880
- }
9881
-
9882
- // Try to extract semantic type from PR title or HEAD commit
9883
- core.debug("Extracting semantic type from PR title...");
9884
- const prTitleType = extractSemanticType(prTitle);
9885
-
9886
- core.debug("Extracting semantic type from HEAD commit...");
9887
- const commitType = extractSemanticType(headCommitMessage);
9850
+ // Check if any type:: labels already exist
9851
+ const existingTypeLabels = labels.filter(label => label.startsWith("type::"));
9852
+ core.debug(`Found ${existingTypeLabels.length} type labels: ${existingTypeLabels.join(", ")}`);
9888
9853
9889
- // Use PR title type first, then fall back to commit type
9890
- const semanticType = prTitleType || commitType;
9891
- if (semanticType) {
9892
- core.debug(`Using semantic type: "${semanticType}"`);
9854
+ // If type labels already exist, skip adding new labels
9855
+ if (existingTypeLabels.length > 0) {
9856
+ core.info("Type labels already exist on PR, skipping adding new labels");
9893
9857
} else {
9894
- core.debug("No semantic type found in PR title or HEAD commit");
9895
- }
9896
-
9897
- // If we found a semantic type that maps to one of our labels, add it if not present
9898
- if (semanticType && SEMANTIC_TYPE_TO_LABEL[semanticType]) {
9899
- const labelToAdd = SEMANTIC_TYPE_TO_LABEL[semanticType];
9900
- core.debug(`Semantic type "${semanticType}" maps to label "${labelToAdd}"`);
9901
-
9902
- // Only add the label if it's not already present
9903
- if (!labels.includes(labelToAdd)) {
9904
- core.info(`Adding label ${labelToAdd} based on semantic commit type: ${semanticType}`);
9905
-
9906
- core.debug("Calling GitHub API to add label...");
9907
- await octokit.rest.issues.addLabels({
9908
- ...github.context.repo,
9909
- issue_number: prNumber,
9910
- labels: [labelToAdd],
9911
- });
9912
- core.debug("Label added successfully via API");
9913
-
9914
- // Update our local labels array to include the new label
9915
- labels.push(labelToAdd);
9916
- addedSemanticLabel = true;
9917
- core.debug(`Updated local labels array: ${labels.join(", ")}`);
9918
-
9919
- // If we just added a label, give it time to apply
9920
- if (addedSemanticLabel) {
9921
- core.info("Added label based on semantic commit message. Waiting for label to apply...");
9922
- // Short delay to allow the label to be properly registered
9923
- core.debug("Waiting 2 seconds for label to propagate...");
9924
- await new Promise(resolve => setTimeout(resolve, 2000));
9925
- core.debug("Wait completed");
9926
-
9927
- // Refetch the labels to ensure we have the most up-to-date set
9928
- core.info("Refetching labels after adding semantic label...");
9929
- core.debug("Calling GitHub API to get updated labels...");
9930
- const updatedLabelsResponse = await octokit.rest.issues.listLabelsOnIssue({
9931
- ...github.context.repo,
9932
- issue_number: github.context.issue.number,
9933
- });
9934
-
9935
- // Update our labels array with the freshly fetched labels
9936
- const updatedLabels = updatedLabelsResponse.data.map((label) => label.name);
9937
- core.debug(`Refetched ${updatedLabels.length} labels: ${updatedLabels.join(", ")}`);
9938
-
9939
- // Replace our labels array with the updated one
9940
- labels.length = 0;
9941
- updatedLabels.forEach(label => labels.push(label));
9942
- core.debug(`Updated local labels array after refetch: ${labels.join(", ")}`);
9943
- }
9944
- } else {
9945
- core.debug(`Label "${labelToAdd}" already exists on PR, no need to add it`);
9946
- }
9947
- } else if (semanticType) {
9948
- core.debug(`Semantic type "${semanticType}" does not map to any of our labels`);
9858
+ // Get PR details to check for semantic PR title
9859
+ await addSemanticLabels(octokit, labels);
9949
9860
}
9950
9861
9951
9862
// ensure exactly one primary label is set
@@ -10001,6 +9912,90 @@ async function run() {
10001
9912
}
10002
9913
}
10003
9914
9915
+ /**
9916
+ * Add labels based on semantic PR title
9917
+ * @param {object} octokit - GitHub API client
9918
+ * @param {string[]} labels - Current labels array to update
9919
+ * @returns {Promise<void>}
9920
+ */
9921
+ async function addSemanticLabels(octokit, labels) {
9922
+ const prNumber = github.context.issue.number;
9923
+ core.debug(`Processing PR #${prNumber}`);
9924
+
9925
+ core.debug("Fetching PR details...");
9926
+ const { data: pullRequest } = await octokit.rest.pulls.get({
9927
+ ...github.context.repo,
9928
+ pull_number: prNumber,
9929
+ });
9930
+
9931
+ // Get the PR title
9932
+ const prTitle = pullRequest.title;
9933
+ core.debug(`PR title: "${prTitle}"`);
9934
+
9935
+ // Try to extract semantic type from PR title only
9936
+ core.debug("Extracting semantic type from PR title...");
9937
+ const semanticType = extractSemanticType(prTitle);
9938
+
9939
+ if (semanticType) {
9940
+ core.debug(`Using semantic type from PR title: "${semanticType}"`);
9941
+ } else {
9942
+ core.debug("No semantic type found in PR title");
9943
+ return;
9944
+ }
9945
+
9946
+ // If we found a semantic type that maps to one of our labels, add it if not present
9947
+ if (!SEMANTIC_TYPE_TO_LABEL[semanticType]) {
9948
+ core.debug(`Semantic type "${semanticType}" does not map to any of our labels`);
9949
+ return;
9950
+ }
9951
+
9952
+ const labelToAdd = SEMANTIC_TYPE_TO_LABEL[semanticType];
9953
+ core.debug(`Semantic type "${semanticType}" maps to label "${labelToAdd}"`);
9954
+
9955
+ // Only add the label if it's not already present
9956
+ if (labels.includes(labelToAdd)) {
9957
+ core.debug(`Label "${labelToAdd}" already exists on PR, no need to add it`);
9958
+ return;
9959
+ }
9960
+
9961
+ core.info(`Adding label ${labelToAdd} based on semantic PR title type: ${semanticType}`);
9962
+
9963
+ core.debug("Calling GitHub API to add label...");
9964
+ await octokit.rest.issues.addLabels({
9965
+ ...github.context.repo,
9966
+ issue_number: prNumber,
9967
+ labels: [labelToAdd],
9968
+ });
9969
+ core.debug("Label added successfully via API");
9970
+
9971
+ // Update our local labels array to include the new label
9972
+ labels.push(labelToAdd);
9973
+ core.debug(`Updated local labels array: ${labels.join(", ")}`);
9974
+
9975
+ core.info("Added label based on semantic PR title. Waiting for label to apply...");
9976
+ // Short delay to allow the label to be properly registered
9977
+ core.debug("Waiting 2 seconds for label to propagate...");
9978
+ await new Promise(resolve => setTimeout(resolve, 2000));
9979
+ core.debug("Wait completed");
9980
+
9981
+ // Refetch the labels to ensure we have the most up-to-date set
9982
+ core.info("Refetching labels after adding semantic label...");
9983
+ core.debug("Calling GitHub API to get updated labels...");
9984
+ const updatedLabelsResponse = await octokit.rest.issues.listLabelsOnIssue({
9985
+ ...github.context.repo,
9986
+ issue_number: github.context.issue.number,
9987
+ });
9988
+
9989
+ // Update our labels array with the freshly fetched labels
9990
+ const updatedLabels = updatedLabelsResponse.data.map((label) => label.name);
9991
+ core.debug(`Refetched ${updatedLabels.length} labels: ${updatedLabels.join(", ")}`);
9992
+
9993
+ // Replace our labels array with the updated one
9994
+ labels.length = 0;
9995
+ updatedLabels.forEach(label => labels.push(label));
9996
+ core.debug(`Updated local labels array after refetch: ${labels.join(", ")}`);
9997
+ }
9998
+
10004
9999
run();
10005
10000
10006
10001
})();
0 commit comments