@@ -211,44 +211,103 @@ jobs:
211211 console.log(`💬 Posting ${results.inlineComments.length} inline comments...`);
212212
213213 try {
214- // Get the PR files and their diff hunks for proper positioning
215- const prFiles = await github.rest.pulls.listFiles ({
214+ // Get the PR info first for commit SHA
215+ const prInfo = await github.rest.pulls.get ({
216216 owner: context.repo.owner,
217217 repo: context.repo.repo,
218218 pull_number: parseInt(prNumber)
219219 });
220220
221- // Get the latest commit SHA for the PR
222- const prData = await github.rest.pulls.get({
221+ const commitSha = prInfo.data.head.sha;
222+ console.log(`📍 Using commit SHA: ${commitSha}`);
223+
224+ // Get the PR diff separately
225+ const prDiff = await github.rest.pulls.get({
223226 owner: context.repo.owner,
224227 repo: context.repo.repo,
225- pull_number: parseInt(prNumber)
228+ pull_number: parseInt(prNumber),
229+ mediaType: {
230+ format: 'diff'
231+ }
226232 });
227233
228- const commitSha = prData.data.head.sha;
234+ const diffContent = prDiff.data; // This is the raw diff content
235+ console.log(`📄 Diff content length: ${diffContent.length} chars`);
236+
237+ // Helper function to calculate diff position from raw diff content
238+ const calculateDiffPositionFromRawDiff = function(diffContent, targetPath, targetLine) {
239+ const lines = diffContent.split('\n');
240+ let currentFile = null;
241+ let position = 0;
242+ let currentNewLine = 0;
243+ let inTargetFile = false;
244+ let inHunk = false;
245+
246+ for (const line of lines) {
247+ if (line.startsWith('diff --git')) {
248+ // Check if this is our target file
249+ inTargetFile = line.includes(targetPath);
250+ position = 0;
251+ currentNewLine = 0;
252+ inHunk = false;
253+ continue;
254+ }
255+
256+ if (!inTargetFile) continue;
257+
258+ // Skip file headers (---, +++)
259+ if (line.startsWith('---') || line.startsWith('+++')) {
260+ continue;
261+ }
262+
263+ if (line.startsWith('@@')) {
264+ // Parse hunk header: @@ -oldStart,oldCount +newStart,newCount @@
265+ const match = line.match(/@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
266+ if (match) {
267+ currentNewLine = parseInt(match[1]) - 1; // Start one before the first line
268+ inHunk = true;
269+ position = 0; // Reset position counter for this hunk
270+ }
271+ continue;
272+ }
273+
274+ if (!inHunk) continue;
275+
276+ // Increment position for every line in the hunk
277+ position++;
278+
279+ if (line.startsWith('+')) {
280+ // This is an added line
281+ currentNewLine++;
282+ if (currentNewLine === targetLine) {
283+ return position;
284+ }
285+ } else if (line.startsWith(' ')) {
286+ // This is a context line (unchanged)
287+ currentNewLine++;
288+ }
289+ // Lines starting with '-' don't increment currentNewLine (they're deleted)
290+ }
291+
292+ return -1; // Line not found in diff
293+ };
229294
230295 // Process inline comments to ensure they have valid positions
231296 const validInlineComments = [];
232297
233298 for (const comment of results.inlineComments) {
234- // Find the corresponding file in the PR
235- const prFile = prFiles.data.find(file => file.filename === comment.path );
299+ // Calculate the position in the diff for this line using the raw diff
300+ const position = calculateDiffPositionFromRawDiff(diffContent, comment.path, comment.line );
236301
237- if (prFile && prFile.patch) {
238- // Calculate the position in the diff for this line
239- const position = this.calculateDiffPosition(prFile.patch, comment.line);
240-
241- if (position > 0) {
242- validInlineComments.push({
243- path: comment.path,
244- position: position, // Use position instead of line for diff-based comments
245- body: comment.body
246- });
247- } else {
248- console.log(`⚠️ Could not find valid diff position for ${comment.path}:${comment.line}`);
249- }
302+ if (position > 0) {
303+ validInlineComments.push({
304+ path: comment.path,
305+ position: position,
306+ body: comment.body
307+ });
308+ console.log(`✅ Valid position found for ${comment.path}:${comment.line} -> position ${position}`);
250309 } else {
251- console.log(`⚠️ File ${comment.path} not found in PR files or has no patch `);
310+ console.log(`⚠️ Could not find valid diff position for ${comment.path}:${comment.line} `);
252311 }
253312 }
254313
@@ -274,7 +333,7 @@ jobs:
274333 if (results.hasMoreIssues) {
275334 const truncationComment = `## 💙 More suggestions available!\n\n` +
276335 `I found ${results.remainingIssues} additional item${results.remainingIssues > 1 ? 's' : ''} to review. ` +
277- `Once you address the current suggestions, I'll be happy to review again and share the remaining feedback!\n\n` +
336+ `Once you address the current suggestions, I'll review again and share the remaining feedback!\n\n` +
278337 `This approach helps keep the review manageable and focused. Thanks for your patience! 😊`;
279338
280339 await github.rest.issues.createComment({
@@ -287,6 +346,7 @@ jobs:
287346
288347 } catch (error) {
289348 console.error('Failed to post inline comments:', error.message);
349+ console.error('Error details:', error);
290350
291351 // Fallback: post inline comments as a single comment
292352 let fallbackComment = '## 📝 Detailed Suggestions\n\n*Unable to post inline comments, here are the specific suggestions:*\n\n';
@@ -306,51 +366,6 @@ jobs:
306366 }
307367 }
308368
309- // Helper function to calculate diff position according to GitHub API
310- this.calculateDiffPosition = function(patch, targetLine) {
311- const lines = patch.split('\n');
312- let position = 0;
313- let currentNewLine = 0;
314- let inHunk = false;
315-
316- for (const line of lines) {
317- // Skip file headers (---, +++)
318- if (line.startsWith('---') || line.startsWith('+++')) {
319- continue;
320- }
321-
322- if (line.startsWith('@@')) {
323- // Parse hunk header: @@ -oldStart,oldCount +newStart,newCount @@
324- const match = line.match(/@@ -\d+(?:,\d+)? \+(\d+)(?:,\d+)? @@/);
325- if (match) {
326- currentNewLine = parseInt(match[1]) - 1; // Start one before the first line
327- inHunk = true;
328- position = 0; // Reset position counter for this hunk
329- }
330- continue;
331- }
332-
333- if (!inHunk) continue;
334-
335- // Increment position for every line in the hunk
336- position++;
337-
338- if (line.startsWith('+')) {
339- // This is an added line
340- currentNewLine++;
341- if (currentNewLine === targetLine) {
342- return position;
343- }
344- } else if (line.startsWith(' ')) {
345- // This is a context line (unchanged)
346- currentNewLine++;
347- }
348- // Lines starting with '-' don't increment currentNewLine (they're deleted)
349- }
350-
351- return -1; // Line not found in diff
352- };
353-
354369 // Set appropriate exit code
355370 if (results.issues.errors.length > 0) {
356371 core.setFailed(`Found ${results.issues.errors.length} critical errors that must be fixed before merging.`);
0 commit comments