diff --git a/src/context.cr b/src/context.cr index d0c92af..ab9763f 100644 --- a/src/context.cr +++ b/src/context.cr @@ -234,6 +234,13 @@ class Package::Context run nil, "sh", ["-x", "-e", "-c", command] end + def captured_sh(command) + output = IO::Memory.new + child = Process.run "sh", ["-x", "-e", "-c", command], output: output + + {child, output} + end + def package(package : Package) : Bool @selected_packaging_backend.package self, package end diff --git a/src/main.cr b/src/main.cr index 6ab2027..0510ba4 100644 --- a/src/main.cr +++ b/src/main.cr @@ -17,6 +17,7 @@ configuration_file_requested = false requested_recipes = [] of String download_only = false do_not_clean = false +watch_only = false used_X = false OptionParser.parse! do |parser| @@ -55,6 +56,10 @@ OptionParser.parse! do |parser| exit 0 } + parser.on("-w", "--watch", "Checks if the recipe is up to date and exits.") { + watch_only = true + } + parser.invalid_option do |flag| STDERR.puts "ERROR: #{flag} is not a valid option." STDERR.puts parser @@ -94,6 +99,22 @@ end # FIXME: Now we need to build their respective deptrees and to deduplicate # the list of recipes. +if watch_only + if recipes.size == 0 + context.repositories.each do |repo| + Dir.children(repo).each do |i| + recipe_file_name = "#{repo}/#{i}/recipe.spec" + if File.exists? recipe_file_name + recipes << context.read_recipe recipe_file_name + end + end + end + end + + recipes.each &.watch + exit 0 +end + begin latest_build_dir = "" diff --git a/src/recipe.cr b/src/recipe.cr index 1a89c86..62eb7a6 100644 --- a/src/recipe.cr +++ b/src/recipe.cr @@ -57,6 +57,8 @@ class Package::Recipe getter sources = Sources.new getter packages = Array(Package).new + getter watch_script : String? + @prefix : String? property recipe_directory = "." @@ -152,6 +154,8 @@ class Package::Recipe @options[key] = value end + when "watch" + @watch_script = value.as_s_or_ls end end @@ -165,7 +169,8 @@ class Package::Recipe @packages << Package.new self, false, fake_root_directory specs.sections.each do |section| - if section.name == "split" + case section.name + when "split" @packages << Package.new self, section end end @@ -340,6 +345,25 @@ class Package::Recipe FileUtils.rm_rf fake_root_directory end + def watch + if script = @watch_script + status, output = @context.captured_sh script + + output = output.to_s + .gsub(/^[ \t\n]*/, "").gsub(/[ \t\n]*$/, "") + + if output != @version + STDERR.puts "WARNING: '#{@name}' is old! (#{output} / #{@version})" + else + puts "'#{@name}' is up to date" + end + + return + end + + STDERR.puts "WARNING: '#{@name}' has no watch." + end + def to_s "#{name}-#{version}" end