aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rwxr-xr-x.local/bin/gittab87
-rwxr-xr-x.local/bin/vimbundle23
-rw-r--r--.local/etc/gittab/basedirs1
-rw-r--r--.local/etc/gittab/tabs/awesome0
-rw-r--r--.local/etc/gittab/tabs/vim (renamed from .vim/bundletab)0
6 files changed, 92 insertions, 24 deletions
diff --git a/.gitignore b/.gitignore
index 9612266..e21b321 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,7 @@
/.local/*
!/.local/bin
/.local/bin/*
-!/.local/bin/vimbundle
+!/.local/bin/gittab
+!/.local/etc
+/.local/etc/*
+!/.local/etc/gittab
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});
+}
diff --git a/.local/bin/vimbundle b/.local/bin/vimbundle
deleted file mode 100755
index 27406fe..0000000
--- a/.local/bin/vimbundle
+++ /dev/null
@@ -1,23 +0,0 @@
-#! /usr/bin/env perl6
-
-#| Update installed bundles for vim.
-sub MAIN ()
-{
- my $bundletab = $*HOME.add(".vim/bundletab");
- my $bundledir = $*HOME.add(".vim/bundle");
-
- die "No bundletab!" unless $bundletab.e;
-
- for $bundletab.lines.grep(!*.starts-with("#")) {
- my ($name, $repo, $branch) = $_.words;
-
- if (!$bundledir.add($name).d) {
- chdir $bundledir;
- run « git clone --single-branch --branch "$branch" --depth 1 "$repo" "$name" »;
- }
-
- chdir $bundledir.add($name);
- run « git switch "$branch" »;
- run « git pull origin "$branch" »;
- }
-}
diff --git a/.local/etc/gittab/basedirs b/.local/etc/gittab/basedirs
new file mode 100644
index 0000000..bc0ee14
--- /dev/null
+++ b/.local/etc/gittab/basedirs
@@ -0,0 +1 @@
+vim .vim/bundle
diff --git a/.local/etc/gittab/tabs/awesome b/.local/etc/gittab/tabs/awesome
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/.local/etc/gittab/tabs/awesome
diff --git a/.vim/bundletab b/.local/etc/gittab/tabs/vim
index a2b9c21..a2b9c21 100644
--- a/.vim/bundletab
+++ b/.local/etc/gittab/tabs/vim