class Snaptoken::Commands::Undiff

Public Class Methods

name() click to toggle source
# File lib/snaptoken/commands/undiff.rb, line 2
def self.name
  "undiff"
end
summary() click to toggle source
# File lib/snaptoken/commands/undiff.rb, line 6
def self.summary
  "Convert steps.diff to steps/. Doesn't\n" +
  "overwrite steps/ unless forced."
end
usage() click to toggle source
# File lib/snaptoken/commands/undiff.rb, line 11
def self.usage
  "[-f] [-q]"
end

Public Instance Methods

run() click to toggle source
# File lib/snaptoken/commands/undiff.rb, line 25
def run
  needs! :config, :diff

  FileUtils.cd(@config[:path]) do
    if @opts[:force]
      FileUtils.rm_rf("steps")
    else
      needs! not: :steps_folder
    end

    FileUtils.mkdir("steps")
    FileUtils.cd("steps") do
      File.open("../steps.diff", "r") do |f|
        step_num = 0
        step = Snaptoken::Step.new(0, nil, [])
        prev_step = nil
        cur_diff = nil
        while line = f.gets
          if line =~ /^~~~ step: ([\s\w-]+)$/
            if cur_diff
              apply_diff(step, cur_diff)
              cur_diff = nil
            end

            prev_step = step
            step = Snaptoken::Step.from_commit_msg(prev_step.number + 1, $1)

            print "\r\e[K[steps.diff -> steps/] #{step.folder_name}" unless @opts[:quiet]

            if step.number == 1
              FileUtils.mkdir(step.folder_name)
            else
              FileUtils.cp_r(prev_step.folder_name, step.folder_name)
            end
          elsif line =~ /^diff --git/
            apply_diff(step, cur_diff) if cur_diff
            cur_diff = line
          elsif cur_diff
            cur_diff << line
          end
        end
        apply_diff(step, cur_diff) if cur_diff
        print "\n" unless @opts[:quiet]
      end
    end
  end
end
setopts!(o) click to toggle source
# File lib/snaptoken/commands/undiff.rb, line 15
def setopts!(o)
  o.on("-f", "--force", "Overwrite steps/ folder") do |f|
    @opts[:force] = f
  end

  o.on("-q", "--quiet", "Don't output progress") do |q|
    @opts[:quiet] = q
  end
end

Private Instance Methods

apply_diff(step, diff) click to toggle source
# File lib/snaptoken/commands/undiff.rb, line 75
def apply_diff(step, diff)
  stdin = IO.popen("git --git-dir= apply \"--directory=#{step.folder_name}\" -", "w")
  stdin.write diff
  stdin.close
end