@@ -23,6 +23,7 @@ const MAX_FILE_SIZE = 20000; // 20K ๋ฌธ์ ์ ํ (OpenAI ํ ํฐ ์์ ์ฅ์น)
2323 * @param {object } prData - PR ๊ฐ์ฒด (draft, labels ํฌํจ)
2424 * @param {string } appToken - GitHub App installation token
2525 * @param {string } openaiApiKey
26+ * @param {string[]|null } [changedFilenames=null] - synchronize ์ ๋ณ๊ฒฝ๋ ํ์ผ๋ช
๋ชฉ๋ก (null์ด๋ฉด ์ ์ฒด ๋ถ์)
2627 */
2728export async function tagPatterns (
2829 repoOwner ,
@@ -31,7 +32,8 @@ export async function tagPatterns(
3132 headSha ,
3233 prData ,
3334 appToken ,
34- openaiApiKey
35+ openaiApiKey ,
36+ changedFilenames = null
3537) {
3638 // 2-1. Skip ์กฐ๊ฑด
3739 if ( prData . draft === true ) {
@@ -58,22 +60,34 @@ export async function tagPatterns(
5860 }
5961
6062 const allFiles = await filesResponse . json ( ) ;
61- const solutionFiles = allFiles . filter (
63+ let solutionFiles = allFiles . filter (
6264 ( f ) =>
6365 ( f . status === "added" || f . status === "modified" ) &&
6466 SOLUTION_PATH_REGEX . test ( f . filename )
6567 ) ;
6668
69+ // changedFilenames๊ฐ ์ ๊ณต๋๋ฉด ํด๋น ํ์ผ๋ง ๋์์ผ๋ก ์ขํ (synchronize ์ต์ ํ)
70+ if ( changedFilenames !== null ) {
71+ const changedSet = new Set ( changedFilenames ) ;
72+ solutionFiles = solutionFiles . filter ( ( f ) => changedSet . has ( f . filename ) ) ;
73+ console . log (
74+ `[tagPatterns] PR #${ prNumber } : narrowed to ${ solutionFiles . length } changed solution files`
75+ ) ;
76+ }
77+
6778 console . log (
68- `[tagPatterns] PR #${ prNumber } : ${ allFiles . length } files, ${ solutionFiles . length } solution files`
79+ `[tagPatterns] PR #${ prNumber } : ${ allFiles . length } total files, ${ solutionFiles . length } solution files to analyze `
6980 ) ;
7081
7182 if ( solutionFiles . length === 0 ) {
7283 return { skipped : "no-solution-files" } ;
7384 }
7485
75- // 2-3. ๊ธฐ์กด Bot ํจํด ํ๊ทธ ์ฝ๋ฉํธ ์ญ์
76- await deletePreviousPatternComments ( repoOwner , repoName , prNumber , appToken ) ;
86+ // 2-3. ๊ธฐ์กด Bot ํจํด ํ๊ทธ ์ฝ๋ฉํธ ์ญ์ (๋ณ๊ฒฝ ํ์ผ๋ง)
87+ const targetFilenames = solutionFiles . map ( ( f ) => f . filename ) ;
88+ await deletePreviousPatternComments (
89+ repoOwner , repoName , prNumber , appToken , targetFilenames
90+ ) ;
7791
7892 // 2-4. ํ์ผ๋ณ OpenAI ๋ถ์ + ์ฝ๋ฉํธ ์์ฑ (๊ฐ ํ์ผ try/catch ๋ํ)
7993 const results = [ ] ;
@@ -101,13 +115,16 @@ export async function tagPatterns(
101115}
102116
103117/**
104- * ๊ธฐ์กด Bot ํจํด ํ๊ทธ ์ฝ๋ฉํธ ์ญ์ (๋ค๋ฅธ ์ฌ์ฉ์ ์ฝ๋ฉํธ๋ ์ ๋ ๊ฑด๋๋ฆฌ์ง ์์)
118+ * ๊ธฐ์กด Bot ํจํด ํ๊ทธ ์ฝ๋ฉํธ ์ญ์ (๋์ ํ์ผ๋ง, ๋ค๋ฅธ ์ฌ์ฉ์ ์ฝ๋ฉํธ๋ ์ ๋ ๊ฑด๋๋ฆฌ์ง ์์)
119+ *
120+ * @param {string[] } targetFilenames - ์ญ์ ๋์ ํ์ผ๋ช
๋ชฉ๋ก
105121 */
106122async function deletePreviousPatternComments (
107123 repoOwner ,
108124 repoName ,
109125 prNumber ,
110- appToken
126+ appToken ,
127+ targetFilenames
111128) {
112129 const response = await fetch (
113130 `https://api.github.com/repos/${ repoOwner } /${ repoName } /pulls/${ prNumber } /comments?per_page=100` ,
@@ -122,8 +139,12 @@ async function deletePreviousPatternComments(
122139 }
123140
124141 const comments = await response . json ( ) ;
142+ const targetSet = new Set ( targetFilenames ) ;
125143 const botPatternComments = comments . filter (
126- ( c ) => c . user ?. type === "Bot" && c . body ?. includes ( COMMENT_MARKER )
144+ ( c ) =>
145+ c . user ?. type === "Bot" &&
146+ c . body ?. includes ( COMMENT_MARKER ) &&
147+ targetSet . has ( c . path )
127148 ) ;
128149
129150 for ( const comment of botPatternComments ) {
@@ -149,7 +170,7 @@ async function deletePreviousPatternComments(
149170 }
150171
151172 console . log (
152- `[tagPatterns] Deleted ${ botPatternComments . length } previous pattern comments`
173+ `[tagPatterns] Deleted ${ botPatternComments . length } previous pattern comments for ${ targetFilenames . length } files `
153174 ) ;
154175}
155176
0 commit comments