Git-Release

 view release on metacpan or  search on metacpan

lib/Git/Release/Branch.pm  view on Meta::CPAN

    return $self;
}

# options:
#
#    ->delete( force => 1 , remote => 1 );
#    ->delete( force => 1 , remote => ['origin','github'] );
#    ->delete( force => 1 , remote => 'github' );

sub delete {
    my ($self,%args) = @_;
    if( $args{remote} ) {
        if( ref($args{remote}) eq 'ARRAY' ) {
            $self->manager->repo->command( 'push' , $_ , ':' . $self->name ) 
                    for @{ $args{remote} };
        } 
        elsif( $args{remote} == 1 && $self->remote_name ) {
            $self->manager->repo->command( 'push' , $self->remote_name , ':' . $self->name );
        }
        else {
            $self->manager->repo->command( 'push' , ($args{remote}) , ':' . $self->name );
        }
    }
    elsif( $args{local} || $self->is_local ) {
        $self->manager->repo->command( 'branch' , $args{force} ? '-D' : '-d' , $self->ref );
    }
    elsif( $self->is_remote ) {
        $self->manager->repo->command( 'push', $self->remote, ':' . $self->name );
    }
    $self->is_deleted(1);
    return $self;
}


=head2 local_rename

Rename branch locally.

=cut

sub local_rename {
    my ($self,$new_name,%args) = @_;
    if( $self->is_local ) {
        if( $args{force} ) {
            $self->manager->repo->command( 'branch','-m',$self->name,$new_name);
        } else {
            $self->manager->repo->command( 'branch','-M',$self->name,$new_name);
        }
        $self->name($new_name);
        $self->update_ref($new_name);
    }
}


=head2 update_ref

update_ref by branch name

=cut

sub update_ref {
    my ($self,$name) = @_;
    if( $self->is_remote ) {
        $self->ref( join '/','remotes',$self->remote,$name );
    } elsif( $self->is_local ) {
        $self->ref( $name );
    }
}

sub rename {
    my ($self,$new_name,%args) = @_;
    if( $self->is_remote ) {
        # if local branch is found, then checkout it 
        # if not found, then checkout remote tracking branch
        my $local = $self->manager->branch->find_local_branches($self->name);
        $local = $self->checkout unless $local;
        $local->pull( 
            remote => $self->remote, 
            no_edit => 1, 
            fast_forward => 1 
        );
        $local->delete( remote => 1 );

        $local->local_rename( $new_name , %args );

        $local->push( $self->remote );
        $self->name($new_name);
        $self->update_ref($new_name);
    }
    elsif( $self->is_local && $self->tracking_ref ) {
        $self->delete( remote => 1 );
        $self->local_rename( $new_name , %args );
        $self->push( $self->remote_name );  # push to tracking remote
    }
    elsif( $self->is_local ) {
        $self->local_rename($new_name,%args);
    }
}

sub checkout {
    my $self = shift;
    if( $self->is_remote ) {
        # find local branch to checkout if the branch exists
        my $local = $self->manager->branch->find_local_branches($self->name);
        if( $local ) {
            $self->manager->repo->command( 'checkout' , $local->name );
            return $local;
        } else {
            $self->manager->repo->command( 'checkout' , '-t' , $self->ref , '-b' , $self->name );
            return $self->manager->branch->new_branch( ref => $self->name );  # local branch instance
        }
    }
    elsif( $self->is_local && $self->tracking_ref ) {
        my $local = $self->manager->branch->find_local_branches($self->name);
        if( $local ) {
            $self->manager->repo->command( 'checkout' , $local->name );
        } else {
            $self->manager->repo->command( 'checkout' , '-t' , $self->tracking_ref , '-b' , $self->name );
        }
        return $self;
    }



( run in 0.990 second using v1.01-cache-2.11-cpan-98e64b0badf )