From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: X-Spam-Status: No, score=-2.9 required=3.0 tests=ALL_TRUSTED,AWL,BAYES_00 shortcircuit=no autolearn=unavailable version=3.3.2 X-Original-To: meta@public-inbox.org Received: from localhost (dcvr.yhbt.net [127.0.0.1]) by dcvr.yhbt.net (Postfix) with ESMTP id 1082D1FA66; Sat, 26 Sep 2015 01:13:01 +0000 (UTC) From: Eric Wong To: meta@public-inbox.org Cc: Eric Wong Subject: [PATCH] ssoma-rm: do not commit changes on auto-removal miss Date: Sat, 26 Sep 2015 01:12:57 +0000 Message-Id: <20150926011257.15583-1-e@80x24.org> List-Id: No-op removals should be idempotent, as multiple reporters may attempt to remove the same message at nearly the same time. --- lib/Ssoma/Git.pm | 2 +- lib/Ssoma/Remover.pm | 4 +++- t/remover.t | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lib/Ssoma/Git.pm b/lib/Ssoma/Git.pm index 60058df..05fa5a3 100644 --- a/lib/Ssoma/Git.pm +++ b/lib/Ssoma/Git.pm @@ -215,7 +215,7 @@ sub cat_blob { sub type { my ($self, $obj) = @_; my $cmd = "git cat-file -t $obj"; - my $str = `$cmd`; + my $str = `$cmd 2>/dev/null`; die "$cmd failed: $?\n" if $?; chomp $str; $str; diff --git a/lib/Ssoma/Remover.pm b/lib/Ssoma/Remover.pm index 5e5872c..184db1a 100644 --- a/lib/Ssoma/Remover.pm +++ b/lib/Ssoma/Remover.pm @@ -30,7 +30,8 @@ sub _remove { my $ref = $self->{ref}; my $tip = $git->qx_sha1("git rev-parse $ref^0"); my $obj = "$tip:$path"; - my $type = $git->type($obj); + my $type = eval { $git->type($obj) }; + return unless defined $type; my (@keep, @remove); if ($type eq "tree") { # unlikely $git->each_in_tree($obj, sub { @@ -50,6 +51,7 @@ sub _remove { } else { die "unhandled type=$type for obj=$obj\n"; } + return unless @remove; my $gii = Ssoma::GitIndexInfo->new; foreach my $rm (@remove) { $gii->remove($rm) } diff --git a/t/remover.t b/t/remover.t index 1d74c02..f714aff 100644 --- a/t/remover.t +++ b/t/remover.t @@ -82,6 +82,24 @@ EOF $expect--; is(scalar @tree, $expect, "$expect messages left"); } + + { + local $ENV{GIT_DIR} = $git_dir; + my $before = `git rev-parse HEAD^0`; + $rm->remove_simple($email); + my $after = `git rev-parse HEAD^0`; + is($before, $after, 'no commit on no-op removal'); + } + + { + local $ENV{GIT_DIR} = $git_dir; + $mda->deliver($email); + my $before = `git rev-parse HEAD^0`; + $email->body_set('changed'); + $rm->remove_simple($email); + my $after = `git rev-parse HEAD^0`; + is($before, $after, 'no commit on no-op removal miss'); + } } done_testing(); -- EW