From ff3586c269e35563ba9f8febc4e261a510c12609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Cohen=20Arazi?= Date: Thu, 2 Oct 2025 23:06:40 -0300 Subject: [PATCH] Fix case when range is HEAD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomás Cohen Arazi --- lib/GitBz/Commands.pm | 2 ++ lib/GitBz/Commands/Attach.pm | 55 ++++++++++++++++++------------------ lib/GitBz/Config.pm | 2 ++ lib/GitBz/Git.pm | 15 +++++++--- 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/lib/GitBz/Commands.pm b/lib/GitBz/Commands.pm index 154978f..f39a5e8 100644 --- a/lib/GitBz/Commands.pm +++ b/lib/GitBz/Commands.pm @@ -16,7 +16,9 @@ package GitBz::Commands; # along with git-bz; if not, see . use Modern::Perl; + use Try::Tiny qw(catch try); + use GitBz::Exception; use GitBz::Config; use GitBz::RestClient; diff --git a/lib/GitBz/Commands/Attach.pm b/lib/GitBz/Commands/Attach.pm index fdac4f3..60f7d2f 100644 --- a/lib/GitBz/Commands/Attach.pm +++ b/lib/GitBz/Commands/Attach.pm @@ -22,6 +22,7 @@ use utf8; use Getopt::Long qw(GetOptionsFromArray); use Try::Tiny qw(catch try); use File::Temp; + use GitBz::Git; use GitBz::Exception; use GitBz::StatusWorkflow; @@ -90,17 +91,17 @@ sub attach_patches { my ( $self, $bug_ref, $commits, $opts ) = @_; my $client = $self->{commands}->{client}; - my $bug = $client->get_bug($bug_ref); - + my $bug = $client->get_bug($bug_ref); + my $is_first = 1; for my $commit (@$commits) { - my $patch = GitBz::Git->format_patch( $commit->{id} . '^..' . $commit->{id} ); - my $filename = sprintf( "%s.patch", substr( $commit->{id}, 0, 7 ) ); + my $patch = GitBz::Git->format_patch( $commit->{id} . '^..' . $commit->{id} ); + my $filename = sprintf( "%s.patch", substr( $commit->{id}, 0, 7 ) ); my $description = $commit->{subject}; - my $body = GitBz::Git->run( 'log', '--format=%b', '-1', $commit->{id} ); - my $comment = $body || "Patch from commit " . substr( $commit->{id}, 0, 7 ); + my $body = GitBz::Git->run( 'log', '--format=%b', '-1', $commit->{id} ); + my $comment = $body || "Patch from commit " . substr( $commit->{id}, 0, 7 ); my @obsoletes; - + if ( $opts->{edit} && $is_first ) { ( $description, $comment, my $obsoletes_ref ) = $self->edit_attachment_comment( $bug, $commit ); @obsoletes = @$obsoletes_ref if $obsoletes_ref; @@ -111,7 +112,7 @@ sub attach_patches { $patch, $filename, $description, - comment => $comment, + comment => $comment, obsoletes => \@obsoletes ); @@ -126,11 +127,11 @@ sub edit_attachment_comment { my $template = ""; $template .= "# Attachment to Bug $bug->{id} - $bug->{summary}\n\n"; $template .= $commit->{subject} . "\n\n"; - + # Add commit body as initial comment my $body = GitBz::Git->run( 'log', '--format=%b', '-1', $commit->{id} ); $template .= $body . "\n\n" if $body; - + # Show existing patches for obsoleting if ( $bug->{attachments} && @{ $bug->{attachments} } ) { for my $patch ( @{ $bug->{attachments} } ) { @@ -140,17 +141,17 @@ sub edit_attachment_comment { } $template .= "\n"; } - + # Add status options - my $client = $self->{commands}->{client}; + my $client = $self->{commands}->{client}; my $workflow = GitBz::StatusWorkflow->new($client); $template .= "# Current status: $bug->{status}\n"; - my $status_values = $workflow->get_next_status_values($bug->{status}); + my $status_values = $workflow->get_next_status_values( $bug->{status} ); for my $status (@$status_values) { $template .= "# Status: $status\n"; } $template .= "\n"; - + # Add patch complexity options my $complexity = $bug->{cf_patch_complexity} || ""; $template .= "# Current patch-complexity: $complexity\n"; @@ -161,19 +162,19 @@ sub edit_attachment_comment { } } $template .= "\n"; - + # Add depends options - my $depends = $bug->{depends_on} || []; - my $depends_str = ref($depends) eq 'ARRAY' ? join(' ', @$depends) : $depends; + my $depends = $bug->{depends_on} || []; + my $depends_str = ref($depends) eq 'ARRAY' ? join( ' ', @$depends ) : $depends; $template .= "# Current depends: $depends_str\n"; $template .= "# Depends: bug xxxx\n"; $template .= "# Depends: bug yyyy\n"; $template .= "\n"; - + $template .= "# Please edit the description (first line) and comment (other lines).\n"; $template .= "# Lines starting with '#' will be ignored. Delete everything to abort.\n"; $template .= "# To obsolete existing patches, uncomment the appropriate lines.\n"; - + my $edited = $self->edit_template($template); return $self->parse_edited_content($edited); } @@ -198,18 +199,16 @@ sub edit_template { sub parse_edited_content { my ( $self, $content ) = @_; - + my @lines = split /\n/, $content; - my @non_comment_lines = grep { !/^#/ && /\S/ } @lines; # Also filter empty lines - + my @non_comment_lines = grep { !/^#/ && /\S/ } @lines; # Also filter empty lines + my $description = shift @non_comment_lines || ""; $description =~ s/^\s+|\s+$//g; - - my @obsoletes; my @comment_lines; - + for my $line (@non_comment_lines) { if ( $line =~ /^\s*Obsoletes\s*:\s*(\d+)/ ) { push @obsoletes, $1; @@ -217,12 +216,12 @@ sub parse_edited_content { push @comment_lines, $line; } } - + my $comment = join( "\n", @comment_lines ); $comment =~ s/^\s+|\s+$//g; - + GitBz::Exception->throw("Empty description, aborting\n") unless $description; - + return ( $description, $comment, \@obsoletes ); } diff --git a/lib/GitBz/Config.pm b/lib/GitBz/Config.pm index d3f9edc..7acc3d5 100644 --- a/lib/GitBz/Config.pm +++ b/lib/GitBz/Config.pm @@ -16,8 +16,10 @@ package GitBz::Config; # along with git-bz; if not, see . use Modern::Perl; + use Config::Tiny; use File::HomeDir; + use GitBz::Git; my $DEFAULT_CONFIG = { diff --git a/lib/GitBz/Git.pm b/lib/GitBz/Git.pm index 490cb7d..ce86e52 100644 --- a/lib/GitBz/Git.pm +++ b/lib/GitBz/Git.pm @@ -40,7 +40,12 @@ sub run { sub rev_list { my ( $class, @args ) = @_; - my $output = $class->run( 'rev-list', '--pretty=format:%s', @args ); + + unshift( @args, '--pretty=format:%s' ); + unshift( @args, '--max-count=1' ) + if $args[1] eq 'HEAD'; + + my $output = $class->run( 'rev-list', @args ); my @commits; my @lines = split /\n/, $output; @@ -64,16 +69,18 @@ sub get_commits { my ( $class, $range ) = @_; # Try as single commit first - exactly like original git-bz - my $rev = try { + my $rev = try { $class->run( 'rev-parse', $range, '--verify' ); - } catch { - undef + } catch { + undef }; if ($rev) { + # Single commit - return just that one commit return $class->rev_list( '--max-count=1', $rev ); } else { + # Not a single commit, treat as range return $class->rev_list($range); } -- 2.51.0