]> git.xolatile.top Git - gorillanest.git/commitdiff
something vaguely representing what we need
authoranon <anon@anon.anon>
Sun, 17 Aug 2025 13:12:07 +0000 (15:12 +0200)
committeranon <anon@anon.anon>
Sun, 17 Aug 2025 13:12:07 +0000 (15:12 +0200)
git-construct.pl [new file with mode: 0755]

diff --git a/git-construct.pl b/git-construct.pl
new file mode 100755 (executable)
index 0000000..5e97088
--- /dev/null
@@ -0,0 +1,57 @@
+#!/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,
+        };
+    }
+
+    my $owner = $repo->run('log', '--reverse', '--pretty=format:%an');
+
+    return {
+        name     => $name,
+        owner    => $owner,
+        branches => \@branches,
+    };
+}
+
+print Dumper( new_repository('./') );