moss

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit e3d767fde6ca3a00a1280d0f8f0d9d7fd2f05485
parent 6d00d222e87858bc7f1bbf47a15bd1ae71e35bdd
Author: Daniel Barlow <dan@telent.net>
Date:   Fri, 13 Aug 2021 14:03:22 +0100

fix exception hierarchy

toplevel rescues MossError, so all the errors we raise intentionally
should subclass that, and anything else will still get a useful backtrace

Diffstat:
Mmoss.rb | 26+++++++++++++++-----------
1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/moss.rb b/moss.rb @@ -14,6 +14,7 @@ def xdg_data_home end class Moss + MossError = Class.new(RuntimeError) attr_reader :root def initialize(root) @@ -47,7 +48,7 @@ class Moss if $CHILD_STATUS.exitstatus.zero? pubkey else - raise "can't get public key from identity #{filename}" + raise MossError, "can't get public key from identity #{filename}" end end @@ -55,7 +56,7 @@ class Moss # named. "initialize" would be a good name if it weren't special to # Ruby def create(keyfile) - keyfile.exist? or raise "Cannot read identity at #{keyfile}" + keyfile.exist? or raise MossError, "Cannot read identity at #{keyfile}" recipient = pubkey_for_identity(keyfile) store.mkpath FileUtils.cp(keyfile, store.parent.join("identity")) @@ -90,11 +91,14 @@ class Moss private def recipients_for_secret(name) pathname = store.join("#{name}.age") find_in_subtree(pathname.parent, ".recipients") or - raise "Can't find .recipients for #{name}" + raise MossError, "Can't find .recipients for #{name}" end - def write_secret(name, content) + def write_secret(name, content, force: false) pathname = store.join("#{name}.age") + if pathname.exist? && !force + raise MossError,"#{pathname.to_s} exists, use --force to overwrite" + end pathname.dirname.mkpath IO.popen([AGE, "-a", "--recipients-file", recipients_for_secret(name).to_s, @@ -111,7 +115,7 @@ class Moss def read_secret(name) pathname = store.join("#{name}.age") - File.exist?(pathname) or raise "Can't open non-existent file #{pathname}" + File.exist?(pathname) or raise MossError, "Can't open non-existent file #{pathname}" capture_output([AGE, "-i", identity_file, "-d", pathname]) @@ -135,7 +139,7 @@ class Moss if git_managed? || parameters.first == "init" Kernel.system(GIT, *parameters, { chdir: store }) else - raise "not a git repo" + raise MossError, "not a git repo" end end end @@ -225,7 +229,7 @@ class CLI "#{method_name} #{param_string}" end - UsageError = Class.new(RuntimeError) + UsageError = Class.new(Moss::MossError) def dispatch(argv) name, payload = parse_arguments(argv) @@ -235,7 +239,7 @@ class CLI else public_send(name, *payload) end - rescue ArgumentError => e + rescue ArgumentError raise UsageError, "usage: moss #{argv.first} #{params_to_s(method(name))}" end end @@ -299,7 +303,7 @@ def cli secret = f.read MOSS.write_secret(file, secret) else - raise $CHILD_STATUS.to_s + raise MossError, $CHILD_STATUS.to_s end end end @@ -323,12 +327,12 @@ def cli cli end + if $PROGRAM_NAME == __FILE__ - # running as a script begin File.umask(0o77) cli.dispatch(ARGV) - rescue StandardError => e + rescue Moss::MossError => e warn e.message exit 1 end