1818if TYPE_CHECKING :
1919 from gh_llm .models import PullRequestMeta , TimelineContext , TimelinePage
2020
21+ DEFAULT_DIFF_HUNK_LINES = 12
22+
2123
2224def register_pr_parser (subparsers : Any ) -> None :
2325 pr_parser = subparsers .add_parser ("pr" , help = "PR-related commands" )
@@ -30,20 +32,38 @@ def register_pr_parser(subparsers: Any) -> None:
3032 view_parser .add_argument ("pr" , nargs = "?" , help = "PR number/url/branch" )
3133 view_parser .add_argument ("--repo" , help = "repository in OWNER/REPO format" )
3234 view_parser .add_argument ("--page-size" , type = int , default = DEFAULT_PAGE_SIZE , help = "timeline entries per page" )
35+ view_parser .add_argument (
36+ "--diff-hunk-lines" ,
37+ type = int ,
38+ default = DEFAULT_DIFF_HUNK_LINES ,
39+ help = "max lines for each review diff hunk (<=0 means full)" ,
40+ )
3341 view_parser .set_defaults (handler = cmd_pr_view )
3442
3543 timeline_expand_parser = pr_subparsers .add_parser ("timeline-expand" , help = "load one timeline page by number" )
3644 timeline_expand_parser .add_argument ("page" , type = int , help = "1-based page number" )
3745 timeline_expand_parser .add_argument ("--pr" , help = "PR number/url/branch" )
3846 timeline_expand_parser .add_argument ("--repo" , help = "repository in OWNER/REPO format" )
3947 timeline_expand_parser .add_argument ("--page-size" , type = int , help = "timeline entries per page" )
48+ timeline_expand_parser .add_argument (
49+ "--diff-hunk-lines" ,
50+ type = int ,
51+ default = DEFAULT_DIFF_HUNK_LINES ,
52+ help = "max lines for each review diff hunk (<=0 means full)" ,
53+ )
4054 timeline_expand_parser .set_defaults (handler = cmd_pr_timeline_expand )
4155
4256 event_parser = pr_subparsers .add_parser ("event" , help = "load one timeline event by global index" )
4357 event_parser .add_argument ("index" , type = int , help = "1-based event index from timeline view" )
4458 event_parser .add_argument ("--pr" , help = "PR number/url/branch" )
4559 event_parser .add_argument ("--repo" , help = "repository in OWNER/REPO format" )
4660 event_parser .add_argument ("--page-size" , type = int , help = "timeline entries per page" )
61+ event_parser .add_argument (
62+ "--diff-hunk-lines" ,
63+ type = int ,
64+ default = 0 ,
65+ help = "max lines for each review diff hunk (default full for event view)" ,
66+ )
4767 event_parser .set_defaults (handler = cmd_pr_event )
4868
4969 review_expand_parser = pr_subparsers .add_parser (
@@ -58,6 +78,12 @@ def register_pr_parser(subparsers: Any) -> None:
5878 review_expand_parser .add_argument ("--pr" , help = "PR number/url/branch" )
5979 review_expand_parser .add_argument ("--repo" , help = "repository in OWNER/REPO format" )
6080 review_expand_parser .add_argument ("--page-size" , type = int , help = "timeline entries per page" )
81+ review_expand_parser .add_argument (
82+ "--diff-hunk-lines" ,
83+ type = int ,
84+ default = DEFAULT_DIFF_HUNK_LINES ,
85+ help = "max lines for each review diff hunk (<=0 means full)" ,
86+ )
6187 review_expand_parser .set_defaults (handler = cmd_pr_review_expand )
6288
6389 checks_parser = pr_subparsers .add_parser ("checks" , help = "show CI checks for the pull request" )
@@ -153,11 +179,12 @@ def register_pr_parser(subparsers: Any) -> None:
153179
154180def cmd_pr_view (args : Any ) -> int :
155181 page_size = int (args .page_size )
182+ diff_hunk_lines = _resolve_diff_hunk_lines (args = args , default = DEFAULT_DIFF_HUNK_LINES )
156183 client = GitHubClient ()
157184 pager = TimelinePager (client )
158185
159186 meta = client .resolve_pull_request (selector = args .pr , repo = args .repo )
160- context , first_page , last_page = pager .build_initial (meta , page_size = page_size )
187+ context , first_page , last_page = pager .build_initial (meta , page_size = page_size , diff_hunk_lines = diff_hunk_lines )
161188 shown_pages : set [int ] = {1 }
162189
163190 for line in render_header (context ):
@@ -170,7 +197,12 @@ def cmd_pr_view(args: Any) -> int:
170197 include_previous = context .total_pages > 2 and context .total_count % context .page_size != 0
171198 if include_previous :
172199 previous_page_number = context .total_pages - 1
173- previous_page = pager .fetch_page (meta = meta , context = context , page = previous_page_number )
200+ previous_page = pager .fetch_page (
201+ meta = meta ,
202+ context = context ,
203+ page = previous_page_number ,
204+ diff_hunk_lines = diff_hunk_lines ,
205+ )
174206 trailing_pages .append ((previous_page_number , previous_page ))
175207 shown_pages .add (previous_page_number )
176208
@@ -213,8 +245,9 @@ def cmd_pr_timeline_expand(args: Any) -> int:
213245 client = GitHubClient ()
214246 pager = TimelinePager (client )
215247 context , meta = _resolve_context_and_meta (client = client , pager = pager , args = args )
248+ diff_hunk_lines = _resolve_diff_hunk_lines (args = args , default = DEFAULT_DIFF_HUNK_LINES )
216249
217- page = pager .fetch_page (meta = meta , context = context , page = int (args .page ))
250+ page = pager .fetch_page (meta = meta , context = context , page = int (args .page ), diff_hunk_lines = diff_hunk_lines )
218251
219252 for line in render_header (context ):
220253 print (line )
@@ -228,6 +261,7 @@ def cmd_pr_event(args: Any) -> int:
228261 client = GitHubClient ()
229262 pager = TimelinePager (client )
230263 context , meta = _resolve_context_and_meta (client = client , pager = pager , args = args )
264+ diff_hunk_lines = _resolve_diff_hunk_lines (args = args , default = 0 )
231265
232266 index = int (args .index )
233267 if index < 1 or index > context .total_count :
@@ -240,6 +274,7 @@ def cmd_pr_event(args: Any) -> int:
240274 page = page_number ,
241275 show_resolved_details = True ,
242276 show_minimized_details = True ,
277+ diff_hunk_lines = diff_hunk_lines ,
243278 )
244279
245280 page_start = (page_number - 1 ) * context .page_size + 1
@@ -257,6 +292,10 @@ def cmd_pr_review_expand(args: Any) -> int:
257292 pager = TimelinePager (client )
258293 context , meta = _resolve_context_and_meta (client = client , pager = pager , args = args )
259294 review_ids = parse_review_ids (args .review_ids )
295+ diff_hunk_lines = _resolve_diff_hunk_lines (args = args , default = DEFAULT_DIFF_HUNK_LINES )
296+ if diff_hunk_lines is not None :
297+ print ("Δ Diff hunk window is limited; rerun with `--diff-hunk-lines 0` for full review diff context." )
298+ print ()
260299
261300 matched : dict [str , tuple [int , TimelinePage ]] = {}
262301 for page_number in range (1 , context .total_pages + 1 ):
@@ -266,6 +305,7 @@ def cmd_pr_review_expand(args: Any) -> int:
266305 page = page_number ,
267306 show_resolved_details = True ,
268307 show_minimized_details = True ,
308+ diff_hunk_lines = diff_hunk_lines ,
269309 )
270310 for offset , event in enumerate (page .items ):
271311 if not event .kind .startswith ("review/" ):
@@ -475,11 +515,26 @@ def _resolve_context_and_meta(
475515 raise RuntimeError ("`--pr` is required when `--repo` is provided" )
476516 page_size = getattr (args , "page_size" , None )
477517 effective_page_size = DEFAULT_PAGE_SIZE if page_size is None else int (page_size )
518+ diff_hunk_lines = _resolve_diff_hunk_lines (args = args , default = DEFAULT_DIFF_HUNK_LINES )
478519 meta = client .resolve_pull_request (selector = selector , repo = repo )
479- context , _ , _ = pager .build_initial (meta = meta , page_size = effective_page_size )
520+ context , _ , _ = pager .build_initial (
521+ meta = meta ,
522+ page_size = effective_page_size ,
523+ diff_hunk_lines = diff_hunk_lines ,
524+ )
480525 return context , meta
481526
482527
528+ def _resolve_diff_hunk_lines (* , args : Any , default : int ) -> int | None :
529+ raw = getattr (args , "diff_hunk_lines" , None )
530+ if raw is None :
531+ raw = default
532+ value = int (raw )
533+ if value <= 0 :
534+ return None
535+ return value
536+
537+
483538def _resolve_pr_meta (* , client : GitHubClient , args : Any ) -> PullRequestMeta :
484539 selector = getattr (args , "pr" , None )
485540 repo = getattr (args , "repo" , None )
0 commit comments