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 )