diff options
Diffstat (limited to 'bin/annex-to-annex-reinject')
-rwxr-xr-x | bin/annex-to-annex-reinject | 101 |
1 files changed, 2 insertions, 99 deletions
diff --git a/bin/annex-to-annex-reinject b/bin/annex-to-annex-reinject index 897c007..b3f5970 100755 --- a/bin/annex-to-annex-reinject +++ b/bin/annex-to-annex-reinject @@ -50,102 +50,5 @@ git-annex-reinject(1), annex-to-annex(1), annex-to-annex-dropunused(1) =cut -use 5.028; -use strict; -use warnings; - -use autodie; -use Git::Annex; -use File::Basename qw(basename dirname); -use File::chmod; -$File::chmod::UMASK = 0; -use File::Path qw(rmtree); -use File::Spec::Functions qw(rel2abs); -use File::Find; -use Try::Tiny; - -die "usage: annex-to-annex-reinject SOURCEANNEX DESTANNEX\n" unless @ARGV == 2; - -my $source = Git::Annex->new($ARGV[0]); -my $dest = Git::Annex->new($ARGV[1]); -#<<< -try { - $source->git->rev_parse({ git_dir => 1 }); -} catch { - die "$ARGV[0] doesn't look like a git repository ..\n"; -}; -try { - $dest->git->rev_parse({ git_dir => 1 }); -} catch { - die "$ARGV[1] doesn't look like a git repository ..\n"; -}; -#>>> - -# `git annex reinject` doesn't work in a bare repo atm -my $use_worktree - = ($dest->git->rev_parse({ is_bare_repository => 1 }))[0] eq 'true'; -my ($temp, $worktree); -if ($use_worktree) { - $temp = tempdir(CLEANUP => 1, DIR => dirname $ARGV[1]); - say "bare repo; our git worktree is in $temp"; - $dest->git->worktree("add", { force => 1, detach => 1 }, - rel2abs($temp), "synced/master"); -} - -my ($source_uuid) = $source->git->config('annex.uuid'); -die "couldn't get source annex uuid" unless $source_uuid =~ /\A[a-z0-9-]+\z/; -my $spk = $source->batch("setpresentkey"); - -my ($source_objects_dir) - = $source->git->rev_parse({ git_path => 1 }, "annex/objects"); -$source_objects_dir = rel2abs $source_objects_dir, $ARGV[0]; -my $reinject_from = $use_worktree ? $temp : $ARGV[1]; -say "reinjecting from $source_objects_dir into $reinject_from"; -find({ - wanted => sub { - -f or return; - say "\nconsidering $_"; - my $dir = dirname $_; - chmod "u+w", $dir, $_; - system "git", "-C", $reinject_from, "annex", "reinject", - "--known", $_; - if (-e $_) { - chmod "u-w", $dir, $_; - } else { - my $key = basename $_; - say "telling setpresentkey process '$key $source_uuid 0'"; - say for $spk->say("$key $source_uuid 0"); - # alt. to setpresentkey: - # say "fscking key $key in $ARGV[0]"; - # system 'git', '-C', $ARGV[0], 'annex', 'fsck', - # '--numcopies=1', '--key', $key; - say "cleaning up empty dirs"; - foreach my $d ($dir, dirname($dir), dirname(dirname($dir))) { - last unless is_empty_dir($d); - rmdir $d; - } - } - }, - no_chdir => 1 - }, - $source_objects_dir -); -if ($use_worktree) { - # we can't use `git worktree remove` because the way git-annex - # worktree support works breaks that command: git-annex replaces - # the .git worktree file with a symlink - rmtree $temp; - $dest->git->worktree("prune"); -} - -# cause setpresentkey changes to be recorded in git-annex branch -undef $spk; -sleep 1; -$source->git->annex("merge"); - -sub is_empty_dir { - -d $_[0] or return 0; - opendir(my $dirh, $_[0]); - my @files = grep { $_ ne '.' && $_ ne '..' } readdir $dirh; - return @files == 0; -} +use App::annex_to_annex_reinject; +exit App::annex_to_annex_reinject->main; |