#! /usr/bin/env ruby require "git" ###################################################################### # # # These codes are from http://github.com/schacon/ruby-git/ and # http://github.com/nishidayuya/ruby-git/ # # |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| # vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv module Git class Lib def ignored_files command_lines('ls-files', ['--others', '-i', '--exclude-standard']) end end class Status private def construct_status @files = @base.lib.ls_files ignore = @base.lib.ignored_files # find untracked in working dir Dir.chdir(@base.dir.path) do Dir.glob('**/*') do |file| @files[file] = {:path => file, :untracked => true} unless @files[file] || ignore_file_type?(file) || ignore.include?(file) end end # find modified in tree @base.lib.diff_files.each do |path, data| @files[path] ? @files[path].merge!(data) : @files[path] = data end # find added but not committed - new files @base.lib.diff_index('HEAD').each do |path, data| @files[path] ? @files[path].merge!(data) : @files[path] = data end @files.each do |k, file_hash| @files[k] = StatusFile.new(@base, file_hash) end end def ignore_file_type?(file) File.directory?(file) || File.pipe?(file) || File.socket?(file) || File.chardev?(file) || File.blockdev?(file) end end end # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| # # These codes are from http://github.com/schacon/ruby-git/ and # http://github.com/nishidayuya/ruby-git/ # # ###################################################################### Dir.chdir("/etc") status = Git.open(".").status sum = %w(changed added deleted untracked).inject(0) { |result, method_name| result + status.send(method_name).length } if sum > 0 system("git", "status") exit(1) end