App-Gitc

 view release on metacpan or  search on metacpan

lib/App/Gitc/Util.pm  view on Meta::CPAN

}


sub guarantee_a_clean_working_directory {
    my $arguments = "diff -C -M --name-status";
    my $staged    = git "$arguments --cached";
    my $changed   = git $arguments;
    return if not $staged and not $changed;

    # the tree is dirty, verify whether to continue
    warn "It looks like you have uncommitted changes. If this is expected,\n"
       . "type 'y' to continue.  If it's not expected, type 'n'.\n"
       . ( $staged  ? "staged:\n$staged\n"   : '' )
       . ( $changed ? "changed:\n$changed\n" : '' )
       ;
    die "Aborting at the user's request.\n" if not confirm('Continue?');

    # stash the changes to let them be restored later
    my $stash = git "stash create";
    git "reset --hard";
    return $stash;
}


sub let_user_edit {
    my ($filename) = @_;

    my $editor = $ENV{EDITOR} || $ENV{VISUAL} || '/usr/bin/vim';
    system "$editor $filename";
}

sub create_blob {
    my ($data_ref) = @_;

    my $tmp_file = "meta-$$.tmp";

    open my $tmp, ">", $tmp_file;
    print {$tmp} Dump($data_ref);
    print {$tmp} "\n";

    my $blob = git "hash-object -w $tmp_file";

    close $tmp;
    unlink $tmp_file;

    return $blob;
}

sub view_blob {
    my ($ref) = @_;

    my $output = git "show $ref";
    
    return ($output and $output !~ /^fatal:/) ? Load($output) : undef;
}

sub get_user_name {
    my $git_user = git 'config --get user.name';
    my $git_config = git_config();

    return $git_user || $git_config->{user}{name} || getpwuid $>;    
}

sub get_user_email {
    my ($user) = @_;
    return git 'config --get user.email' unless $user;
    fetch_tags();
    my $git_config = git_config();

    my $user_info = view_blob("user/$user") || {};

    return $user_info->{email} || $git_config->{user}{email} || $user; 
}

sub add_current_user {
    my $user  = get_user_name();
    my $email = get_user_email();
    # get user email defaults to returning username if not configured in git
    # die if not configured
    die "You need to configure a git username and email." unless $user ne $email;

    my $user_info = {email => $email};
    my $blob = create_blob($user_info);

    git_tag('-d', "user/$user") if view_blob("user/$user");
    git_tag("user/$user", $blob);
    return git "push --force origin user/$user";
}


sub meta_data_add {
    my ($entries) = @_;
    if (ref($entries) ne 'ARRAY') {
        $entries = $entries ? [ $entries ] : [];
    }

    my @meta_tags = get_meta_tags();
    my %meta_tags;
    ++$meta_tags{$_} for @meta_tags;

    our $tag_buffer;
    initialize_tag_buffer() unless $tag_buffer;
    my @tags;
    my $single_id;

    my $flush = 1;
    for my $data (@$entries) {
        # remember which user performed this action
        $data->{user} = get_user_name() if not exists $data->{user};
        my $changeset = $data->{changeset};

        my $meta_info = $meta_tags{"meta/$changeset"} ? view_blob("meta/$changeset") : [];
        my $id = scalar @$meta_info;
        $single_id = $id if @$entries == 1;

        my $flag = delete $data->{flush};
        $flush = 0 if defined $flag and $flag == 0; 
        $data->{stamp} = time;
        $meta_info->[$id] = $data;

        my $blob = create_blob($meta_info);



( run in 0.536 second using v1.01-cache-2.11-cpan-f56aa216473 )