Class: Dorian::Git::Tree

Inherits:
Object
  • Object
show all
Defined in:
lib/dorian/git/tree.rb

Constant Summary collapse

SPACE =
"    "
RIGHT =
"└── "
DOWN =
"│    "
DOWN_AND_RIGHT =
"├── "

Class Method Summary collapse

Class Method Details

.git_ls_files(path) ⇒ Object



32
33
34
# File 'lib/dorian/git/tree.rb', line 32

def self.git_ls_files(path)
  `#{["git", "ls-files", path].compact.shelljoin}`.split("\n")
end

.group(files) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/dorian/git/tree.rb', line 36

def self.group(files)
  files
    .group_by { |file| file.split("/").first }
    .transform_values do |values|
      group(
        values
          .map { |value| value.split("/")[1..-1].join("/") }
          .reject(&:empty?)
      )
    end
end


48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/dorian/git/tree.rb', line 48

def self.print(key:, values:, index: 0, size: 1, prefix: "")
  key = "#{key}/" if values.any?
  last = index + 1 == size
  right_prefix = last ? RIGHT : DOWN_AND_RIGHT
  puts prefix + right_prefix + key
  values.each.with_index do |(value_key, value_values), value_index|
    print(
      key: value_key,
      values: value_values,
      index: value_index,
      size: values.size,
      prefix: prefix + (last ? SPACE : DOWN)
    )
  end
end

.runObject



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/dorian/git/tree.rb', line 11

def self.run
  if ARGV[0] == "--help" || ARGV[0] == "-h" || ARGV.size > 1
    puts "USAGE: git tree [PATH]"
    exit
  end

  key = ARGV.first || "."
  files = git_ls_files(key)
  values = group(files)
  key = "#{key}/" if values.any? && key != "." && key[-1] != "/"
  puts key
  values.each.with_index do |(value_key, value_values), value_index|
    print(
      key: value_key,
      values: value_values,
      index: value_index,
      size: values.size,
    )
  end
end