aboutsummaryrefslogtreecommitdiff
path: root/.local/bin/gittab
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/gittab')
-rwxr-xr-x.local/bin/gittab87
1 files changed, 87 insertions, 0 deletions
diff --git a/.local/bin/gittab b/.local/bin/gittab
new file mode 100755
index 0000000..1877ac2
--- /dev/null
+++ b/.local/bin/gittab
@@ -0,0 +1,87 @@
+#! /usr/bin/env perl6
+
+use v6.d;
+
+constant TABDIR = $*HOME.add('.local/etc/gittab/tabs');
+constant TABCONF = $*HOME.add('.local/etc/gittab/basedirs');
+
+#| Update managed git repositories
+multi sub MAIN (
+ #| A list of targets to update.
+ *@targets,
+) {
+ @targets = TABDIR.dir.map(*.basename) unless @targets;
+
+ for @targets -> $target {
+ my $tab = find-tab($target);
+
+ note "No gittab for target '$target'" unless $tab;
+
+ my $basedir = get-basedir($target);
+
+ mkdir($basedir) unless $basedir.d;
+
+ for $tab.lines.grep(!*.starts-with("#")) {
+ my ($name, $repo, $branch) = $_.words;
+
+ if (!$basedir.add($name).d) {
+ chdir $basedir;
+ run « git clone --single-branch --branch "$branch" --depth 1 "$repo" "$name" »;
+ }
+
+ chdir $basedir.add($name);
+ run « git switch "$branch" »;
+ run « git pull origin "$branch" »;
+ }
+ }
+}
+
+#| List managed git repositories
+multi sub MAIN (
+ Bool:D :$list!,
+) {
+ my @tabs = TABDIR.dir.map(*.basename).sort;
+ my $longest = @tabs.map(*.chars).sort.tail;
+
+ for @tabs {
+ "%-{$longest}s %s\n".printf($_, get-basedir($_));
+ }
+}
+
+sub find-tab (
+ Str:D $name,
+) {
+ my @attempts =
+ $name,
+ $name ~ 'tab',
+ ;
+
+ for @attempts {
+ my $fh = TABDIR.add($_);
+
+ return $fh if $fh.f;
+ }
+
+ Nil;
+}
+
+sub get-basedir (
+ Str:D $tab,
+) {
+ state %basedirs;
+
+ if (!%basedirs && TABCONF.e) {
+ TABCONF
+ .lines
+ .grep(!*.starts-with('#'))
+ .map({
+ my ($tab, $basedir) = $_.words;
+
+ %basedirs{$tab} = $basedir.IO;
+ })
+ }
+
+ return $*HOME unless %basedirs{$tab}:exists;
+
+ $*HOME.add(%basedirs{$tab});
+}