@@ -6,21 +6,21 @@ use mcptools_core::atlassian::bitbucket::{
66 transform_pr_response, BitbucketComment , BitbucketCommentsResponse , BitbucketDiffstat ,
77 BitbucketDiffstatResponse , BitbucketPRResponse , PROutput ,
88} ;
9- use serde:: { Deserialize , Serialize } ;
9+ use serde:: Deserialize ;
1010
1111/// Options for reading a Bitbucket PR
12- #[ derive( Debug , clap:: Args , Serialize , Deserialize , Clone ) ]
12+ #[ derive( Debug , clap:: Args , Deserialize , Clone ) ]
1313pub struct ReadOptions {
1414 /// Repository in workspace/repo_slug format (e.g., "myworkspace/myrepo")
15- #[ clap ( long, short = 'r' ) ]
15+ #[ arg ( long, short = 'r' ) ]
1616 pub repo : String ,
1717
1818 /// Pull request number
19- #[ clap ( value_name = "PR_NUMBER" ) ]
19+ #[ arg ( value_name = "PR_NUMBER" ) ]
2020 pub pr_number : u64 ,
2121
2222 /// Bitbucket API base URL (overrides BITBUCKET_BASE_URL env var)
23- #[ clap ( long) ]
23+ #[ arg ( long) ]
2424 pub base_url : Option < String > ,
2525
2626 /// Maximum number of comments per page (default: 100)
@@ -75,13 +75,6 @@ pub struct ReadPRParams {
7575 pub no_diff : bool ,
7676}
7777
78- /// Helper to set spinner message if spinner is present
79- fn set_spinner_msg ( spinner : Option < & ProgressBar > , msg : impl Into < String > ) {
80- if let Some ( s) = spinner {
81- s. set_message ( msg. into ( ) ) ;
82- }
83- }
84-
8578/// Fetch PR data from Bitbucket API
8679///
8780/// This function fetches PR details, comments, diffstats, and optionally diff content.
@@ -104,7 +97,7 @@ pub async fn read_pr_data(params: ReadPRParams, spinner: Option<&ProgressBar>) -
10497 let base_url = config. base_url . trim_end_matches ( '/' ) ;
10598
10699 // Fetch PR details
107- set_spinner_msg (
100+ super :: set_spinner_msg (
108101 spinner,
109102 format ! ( "Fetching PR #{} from {}..." , pr_number, repo) ,
110103 ) ;
@@ -145,7 +138,7 @@ pub async fn read_pr_data(params: ReadPRParams, spinner: Option<&ProgressBar>) -
145138 . ok_or_else ( || eyre ! ( "PR response missing destination commit hash" ) ) ?;
146139
147140 // Fetch diffstats (auto-paginate by default)
148- set_spinner_msg ( spinner, "Fetching diffstats..." ) ;
141+ super :: set_spinner_msg ( spinner, "Fetching diffstats..." ) ;
149142 let diffstats = fetch_all_diffstats (
150143 & client,
151144 base_url,
@@ -162,12 +155,12 @@ pub async fn read_pr_data(params: ReadPRParams, spinner: Option<&ProgressBar>) -
162155 let diff_content = if no_diff {
163156 None
164157 } else {
165- set_spinner_msg ( spinner, "Fetching diff content..." ) ;
158+ super :: set_spinner_msg ( spinner, "Fetching diff content..." ) ;
166159 Some ( fetch_diff_content ( & client, base_url, & repo, pr_number) . await ?)
167160 } ;
168161
169162 // Fetch ALL comments (auto-paginate by default)
170- set_spinner_msg ( spinner, "Fetching comments..." ) ;
163+ super :: set_spinner_msg ( spinner, "Fetching comments..." ) ;
171164 let comments = fetch_all_comments (
172165 & client,
173166 base_url,
@@ -245,7 +238,7 @@ async fn fetch_all_diffstats(
245238 let mut page = 1 ;
246239 while let Some ( url) = next_url {
247240 if page > 1 {
248- set_spinner_msg ( spinner, format ! ( "Fetching diffstats (page {})..." , page) ) ;
241+ super :: set_spinner_msg ( spinner, format ! ( "Fetching diffstats (page {})..." , page) ) ;
249242 }
250243 let response = client
251244 . get ( & url)
@@ -299,7 +292,7 @@ async fn fetch_all_comments(
299292 let mut page = 1 ;
300293 while let Some ( url) = next_url {
301294 if page > 1 {
302- set_spinner_msg (
295+ super :: set_spinner_msg (
303296 spinner,
304297 format ! (
305298 "Fetching comments (page {}, {} found)..." ,
@@ -389,7 +382,7 @@ pub async fn handler(options: ReadOptions, global: crate::Global) -> Result<()>
389382 let mut table = crate :: prelude:: new_table ( ) ;
390383 table. add_row ( prettytable:: row![
391384 "State" . bold( ) . cyan( ) ,
392- format_state( & pr. state)
385+ super :: format_state( & pr. state)
393386 ] ) ;
394387 table. add_row ( prettytable:: row![
395388 "Author" . bold( ) . cyan( ) ,
@@ -601,13 +594,3 @@ fn render_change_bar(additions: u32, deletions: u32) -> String {
601594
602595 format ! ( "{}{}" , add_bar, del_bar)
603596}
604-
605- fn format_state ( state : & str ) -> String {
606- match state. to_uppercase ( ) . as_str ( ) {
607- "OPEN" => state. bright_green ( ) . to_string ( ) ,
608- "MERGED" => state. bright_magenta ( ) . to_string ( ) ,
609- "DECLINED" => state. bright_red ( ) . to_string ( ) ,
610- "SUPERSEDED" => state. bright_yellow ( ) . to_string ( ) ,
611- _ => state. to_string ( ) ,
612- }
613- }
0 commit comments