aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit-construct.pl58
1 files changed, 58 insertions, 0 deletions
diff --git a/git-construct.pl b/git-construct.pl
new file mode 100755
index 0000000..4024ef1
--- /dev/null
+++ b/git-construct.pl
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use Git::Repository;
+use Cwd 'realpath';
+use File::Basename;
+
+use Data::Dumper;
+
+sub new_repository {
+ my ($path) = @_;
+ $path = realpath($path);
+
+ my $name = basename($path);
+ my $repo = Git::Repository->new(work_tree => $path);
+
+ my @raw_branches = $repo->run('branch');
+ my @branches;
+
+ for my $b (@raw_branches) {
+ chomp $b;
+ my $is_active = 0;
+
+ if ($b =~ /^\* /) {
+ $b =~ s/^\* //;
+ $is_active = 1;
+ }
+
+ my @commits;
+ my @logs = $repo->run(log => $b, '--pretty=format:%H;%an;%s');
+ for my $line (@logs) {
+ my ($hash, $author, $message) = split /;/, $line, 3;
+ push @commits, {
+ hash => $hash,
+ author => $author,
+ message => $message,
+ };
+ }
+
+ push @branches, {
+ name => $b,
+ is_active => $is_active,
+ commits => \@commits,
+ };
+ }
+
+ # first commiter as a fallback
+ my $owner = ($repo->run('log', '--reverse', '--pretty=format:%an'))[0];
+
+ return {
+ name => $name,
+ owner => $owner,
+ branches => \@branches,
+ };
+}
+
+print Dumper( new_repository('./') );