Skip to content

Commit cab3e14

Browse files
committed
✨ feat: Add support for customizable diff hunk line limits in PR commands, enhancing review flexibility
1 parent bb75d66 commit cab3e14

4 files changed

Lines changed: 140 additions & 23 deletions

File tree

src/gh_llm/commands/pr.py

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
if TYPE_CHECKING:
1919
from gh_llm.models import PullRequestMeta, TimelineContext, TimelinePage
2020

21+
DEFAULT_DIFF_HUNK_LINES = 12
22+
2123

2224
def 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

154180
def 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+
483538
def _resolve_pr_meta(*, client: GitHubClient, args: Any) -> PullRequestMeta:
484539
selector = getattr(args, "pr", None)
485540
repo = getattr(args, "repo", None)

0 commit comments

Comments
 (0)