diff --git a/crew b/crew index d37204d6b7..e9991fadcc 100755 --- a/crew +++ b/crew @@ -70,20 +70,6 @@ USER = `whoami`.chomp $LOAD_PATH.unshift "#{CREW_LIB_PATH}lib" -# Parse arguments using docopt - -require 'docopt' -begin - args = Docopt::docopt(DOC) -rescue Docopt::Exit => e - puts e.message - exit 1 -end - -@opt_keep = args["--keep"] -@opt_verbose = args["--verbose"] -@opt_src = args["--build-from-source"] - # colorization class String def colorize(color_code, shade) @@ -155,9 +141,24 @@ class String end end +return 0 if defined? CREW_INIT_ONLY + #disallow sudo abort "Chromebrew should not be run as root.".lightred if Process.uid == 0 +# Parse arguments using docopt +require 'docopt' +begin + args = Docopt::docopt(DOC) +rescue Docopt::Exit => e + puts e.message + exit 1 +end + +@opt_keep = args["--keep"] +@opt_verbose = args["--verbose"] +@opt_src = args["--build-from-source"] + @device = JSON.parse(File.read(CREW_CONFIG_PATH + 'device.json'), symbolize_names: true) #symbolize also values @device.each do |key, elem| @@ -203,9 +204,9 @@ end def regexp_search(pkgName) results = Dir["#{CREW_LIB_PATH}packages/*.rb"].sort \ - .select { |f| File.basename(f, '.rb') =~ Regexp.new(pkgName, true) } \ - .collect { |f| File.basename(f, '.rb') } \ - .each { |f| print_package(f, @opt_verbose) } + .select { |f| File.basename(f, '.rb') =~ Regexp.new(pkgName, true) } \ + .collect { |f| File.basename(f, '.rb') } \ + .each { |f| print_package(f, @opt_verbose) } if results.empty? Find.find ("#{CREW_LIB_PATH}packages/") do |packageName| if File.file? packageName @@ -654,7 +655,7 @@ def install # perform post-install process post_install target_dir end - + #add to installed packages @device[:installed_packages].push(name: @pkg.name, version: @pkg.version) File.open(CREW_CONFIG_PATH + 'device.json', 'w') do |file| diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000000..4fa0e6ffff --- /dev/null +++ b/tests/README.md @@ -0,0 +1,7 @@ +## Creating tests + +To create a test, just create a `.rb` file. It should finish normally if the test passed, and end with `exit 1` otherwise, preferably explaining why the test failed. + +## Running tests + +Just run the `test_all` file. Running tests manually may not work! diff --git a/tests/no_cycles.rb b/tests/no_cycles.rb new file mode 100644 index 0000000000..1aaae0e334 --- /dev/null +++ b/tests/no_cycles.rb @@ -0,0 +1,50 @@ +require 'find' + +@all_pkgs = {} + +# Loads all packages +Find.find("../packages") do |filename| + if File.extname(filename) == '.rb' + name = File.basename(filename, '.rb') + require("../packages/" + name) + pkg = Object.const_get(name.capitalize) + pkg.name = name + @all_pkgs[name] = pkg + end +end + +# Looking for cycles. @path will keep the current dependency path. +# @state will store :on_path for vertices on the current dependency path +# and :visited for vertices that have already been checked not to lead to +# cycles. +@state = {} +@path = [] +def dfs(pkg) + @path.push(pkg.name) + if @state[pkg] == :on_path + puts "Found dependency cycle!".lightred + while @path.first != @path.last + @path.shift + end + puts @path.to_s + exit 1 + elsif @state[pkg] == nil + @state[pkg] = :on_path + if pkg.dependencies + pkg.dependencies.each do |name, v| + if name != pkg.name + dfs(@all_pkgs[name]) + end + end + end + @state[pkg] = :visited + end + @path.pop +end + +# Calls dfs for every path +@all_pkgs.each do |name, pkg| + dfs(pkg) +end + +puts "No dependency cycles found.".lightgreen diff --git a/tests/test_all b/tests/test_all new file mode 100755 index 0000000000..11028ac6bc --- /dev/null +++ b/tests/test_all @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby + +CREW_INIT_ONLY = true +load '../crew' + +puts "Running tests..." + +Find.find(".") do |filename| + if File.extname(filename) == '.rb' + puts "\nTest Name: #{File.basename(filename, ".rb")}" + load filename + end +end + +puts "\nAll tests successful.".lightgreen