class GitObjectBrowser::Dumper::Main

Public Class Methods

execute(target, outdir, step, diff_dir) click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 8
def self.execute(target, outdir, step, diff_dir)
  outdir = File.expand_path(outdir)

  if outdir =~ %r{(?:^|/).git(?:/|$)} && outdir !~ %r{/.git/dump/?\z}
    raise 'Dump directory must be .git/dump if you dump into the .git directory.'
  end

  if File.exist?(outdir)
    Dir.chdir(outdir) do
      if !Dir.glob('*').empty? &&  Dir.glob('json/**/_git.json').empty?
        raise 'dump directory exists but it may not be the old dump directory. json/**/_git.json doesn\'t exist.'
      end
    end
  end

  if diff_dir
    diff_dir = File.expand_path(diff_dir)
    raise "#{ diff_dir } must be directory." unless File.directory?(diff_dir)
    raise "#{ diff_dir }/_git.json doesn't exist" unless File.exist?(File.join(diff_dir, '_git.json'))
  end

  new(target, outdir, step, diff_dir).dump
end
new(target, outdir, step, diff_dir) click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 32
def initialize(target, outdir, step, diff_dir)
  @target = target
  @outdir = outdir
  @step = step
  @diff_dir = diff_dir

  if @step
    (@diff_dir, @step) = find_next_dir if @step == :next
    @json_dir = File.join(@outdir, 'json', @step)
  else
    @json_dir = File.join(@outdir, 'json')
  end
end

Public Instance Methods

copy_htdocs() click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 202
def copy_htdocs
  puts "-- Copy htdocs"
  Dir.chdir(HTDOCS_DIR) do
    Dir.glob('*').each do |file|
      next if %w{config.js default.js}.include?(file)
      if File.directory?(file)
        puts "Copy: #{file}/*"
      else
        puts "Copy: #{file}"
      end
      FileUtils.copy_entry(file, File.join(@outdir, file))
    end
  end
end
create_config() click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 77
def create_config
  puts "-- Create config files"
  unless File.exist?(File.join(@outdir, 'config.js'))
    puts "Write: config.js"
    FileUtils.copy_entry(File.join(HTDOCS_DIR, 'config.js'),
                         File.join(@outdir, 'config.js'))
  end

  puts "Write: default.js"
  default_file = File.join(@outdir, 'default.js')
  if File.exist?(default_file)
    conf = File.read(default_file)
    create = false
  else
    conf = File.read(File.join(HTDOCS_DIR, 'default.js'))
    create = true
  end
  if conf =~ /var config = (\{.+\});/m
    json = $1
  else
    json = '{}'
  end
  conf = JSON.parse(json)
  if create
    conf['loadNote'] = true
    conf['loadDiff'] = true
  end
  conf['steps'] = [] unless conf['steps'].is_a? Array
  if @step
    conf['steps'] << { 'name' => @step, 'label' => @step }
  end

  File.open(default_file, 'w') do |io|
    io << "// Edit config.js instead of this file.\n"
    io << "// This file will be rewritten by git object-browser command.\n"
    io << "var config = " + JSON.pretty_generate(conf) + ";\n"
  end
end
create_diff_data() click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 116
def create_diff_data
  return unless @step
  unless @diff_dir
    puts "-- Create empty diff data"
    puts "Write: _diff.json"
    File.open(File.join(@json_dir, '_diff.json'), 'w') do |io|
      io << '[]'
    end
    return
  end

  puts "-- Create diff data"
  old_files = []
  Dir.chdir(@diff_dir) do
    Dir.glob("**/*").each do |file|
      next unless File.file?(file)
      next if File.directory?(file.sub(/\.json\z/, ''))
      next if %w{_git.json _diff.json}.include?(file)
      old_files << file
    end
  end

  new_files = []
  Dir.chdir(@json_dir) do
    Dir.glob("**/*").each do |file|
      next unless File.file?(file)
      next if File.directory?(file.sub(/\.json\z/, ''))
      next if %w{_git.json _diff.json}.include?(file)
      new_files << file
    end
  end

  diff_files = []

  common_files = old_files & new_files
  common_files.each do |file|
    a = File.join(@diff_dir, file)
    b = File.join(@json_dir, file)
    unless FileUtils.cmp(a, b)
      diff_files << file.sub(/\.json\z/, '')
    end
  end

  removed_files = old_files - new_files
  removed_files.each do |file|
    diff_files << file.sub(/\.json\z/, '')
  end

  added_files = new_files - old_files
  added_files.each do |file|
    diff_files << file.sub(/\.json\z/, '')
  end

  puts "Write: _diff.json"
  File.open(File.join(@json_dir, '_diff.json'), 'w') do |io|
    io << JSON.pretty_generate(diff_files)
  end
end
create_note() click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 217
def create_note
  if @step
    FileUtils.mkdir_p(File.join(@outdir, 'notes'))
    path = File.join(@outdir, 'notes', "#{ @step }.html")
    msg = "Create: notes/#{ @step }.html"
  else
    path = File.join(@outdir, 'note.html')
    msg = "Create: note.html"
  end
  unless File.exist?(path)
    puts "-- Create note"
    puts msg
    File.open(path, 'w') {}
  end
end
dump() click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 64
def dump
  dump_objects
  copy_htdocs
  create_config
  create_diff_data
  create_note
  if @step
    puts "-- Complete: #{ @step }"
  else
    puts "-- Complete"
  end
end

Private Instance Methods

dump_objects() click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 175
def dump_objects
  if File.exist?(@json_dir)
    puts "-- Remove old JSON files"
    if @step
      puts "Remove: json/#{ @step }"
    else
      puts "Remove: json/*"
    end
    FileUtils.rm_r(@json_dir)
  end
  puts "-- Dump objects"
  FileUtils.mkdir_p(@json_dir)
  [IndexDumper,
   ObjectsDumper,
   RefsDumper,
   ReflogDumper,
   DirectoriesDumper,
   PlainFilesDumper,
   PackIndexesDumper,
   PackedRefsDumper,
   InfoRefsDumper,
  ].each do |dumper|
    dumper.new(@target, @json_dir).dump
  end
end
find_next_dir() click to toggle source
# File lib/git-object-browser/dumper/main.rb, line 46
def find_next_dir
  json_dir = File.join(@outdir, 'json')
  FileUtils.mkdir_p(json_dir) unless File.exist?(json_dir)
  dir = Dir.open(json_dir).map do |dir|
    if dir =~ /\Astep(\d+)\z/
      [dir, $1.to_i]
    else
      nil
    end
  end.compact.sort {|a,b| a[1] <=> b[1] }.last
  if dir
    return [File.join(json_dir, dir[0]), "step#{dir[1] + 1}"]
  else
    return [nil, "step1"]
  end
end