oleg 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e4f90f727a10550fe24d3d8a9f97c8c05dd38b5
4
- data.tar.gz: 98368a97bdfb2e8bc5709ae44e14bb41b72f6f40
3
+ metadata.gz: bf4f5f87c6d337bb62e7b3df44db52ec21b28b6d
4
+ data.tar.gz: 38d29d3088c021488ee771d61093893011964e80
5
5
  SHA512:
6
- metadata.gz: 1aa44cfd06b459245ae6c0e76ab8da5e80c9d9d8927f6dc378e61f50dad04b18c9837c6d1ad44b911589f3c5c8e94b847e17edaf8062616a88466b16676cea45
7
- data.tar.gz: f45af9fcada0e077125787f8c78fb84dbe405cd801950819b41479dae1da874bb7d26ea7c37dab5ac815424f7002884433092489cde45514c575c7d5eaa1830f
6
+ metadata.gz: a245d260ca274707448ac4f2c3671f46c4cb8b6a57eab49fa68087b9a65ac876cc3c1ff2a651fc9c814a371ef305e2dadf3cc973ca585366fea5dc81d38fb731
7
+ data.tar.gz: c120b9ab3436791c35bfe5642e050f7005375cd6c95b36f49cc3c29dffa9334bf5b555947dfcff9f113cea243562c78f83cb296e631397a1300d29ce13e3d4ab
data/lib/leg/cli.rb CHANGED
@@ -5,6 +5,7 @@ class Leg::CLI
5
5
  initial_dir = FileUtils.pwd
6
6
 
7
7
  last_dir = nil
8
+ last_dir2 = nil
8
9
  while FileUtils.pwd != last_dir
9
10
  if File.exist?(CONFIG_FILE)
10
11
  @config = YAML.load(File.read(CONFIG_FILE))
@@ -13,11 +14,12 @@ class Leg::CLI
13
14
  exit!
14
15
  end
15
16
  @config[:path] = FileUtils.pwd
16
- @config[:step_path] = last_dir
17
+ @config[:step_path] = last_dir2
17
18
  @config[:orig_path] = initial_dir
18
19
  break
19
20
  end
20
21
 
22
+ last_dir2 = last_dir
21
23
  last_dir = FileUtils.pwd
22
24
  FileUtils.cd('..')
23
25
  end
@@ -28,6 +30,12 @@ class Leg::CLI
28
30
  def run(args)
29
31
  args = ["help"] if args.empty?
30
32
  cmd_name = args.shift.downcase
33
+
34
+ if cmd_name =~ /\A\d+\z/
35
+ args.unshift(cmd_name)
36
+ cmd_name = "ref"
37
+ end
38
+
31
39
  if cmd = Leg::Commands::LIST.find { |cmd| cmd.name == cmd_name }
32
40
  cmd.new(args, @config).run
33
41
  else
data/lib/leg/commands.rb CHANGED
@@ -7,6 +7,7 @@ require 'leg/commands/base_command'
7
7
  require 'leg/commands/diff'
8
8
  require 'leg/commands/help'
9
9
  require 'leg/commands/pieces'
10
+ require 'leg/commands/ref'
10
11
  require 'leg/commands/repo'
11
12
  require 'leg/commands/undiff'
12
13
  require 'leg/commands/unrepo'
@@ -13,27 +13,59 @@ class Leg::Commands::BaseCommand
13
13
  end
14
14
 
15
15
  ERROR_MSG = {
16
- config: "You are not in a leg working directory.",
16
+ config: {
17
+ true: "You are not in a leg working directory.",
18
+ false: "You are already in a leg working directory."
19
+ },
20
+ steps_folder: {
21
+ true: "There is no steps folder.",
22
+ false: "There is already a steps folder."
23
+ },
24
+ steps: {
25
+ true: "There are no steps in the steps folder."
26
+ },
27
+ repo: {
28
+ true: "There is no repo folder.",
29
+ false: "There is already a repo folder."
30
+ },
31
+ diff: {
32
+ true: "There is no steps.diff file."
33
+ }
17
34
  }
18
35
 
19
- def needs!(what)
20
- valid = false
36
+ def needs!(*whats)
37
+ options = whats.pop if whats.last.is_a? Hash
38
+ options ||= {}
21
39
 
22
- case what
23
- when :config
24
- valid = true if @config
25
- else
26
- raise NotImplementedError
27
- end
40
+ yes = Array(whats).flatten.map { |w| [w, true] }
41
+ no = Array(options[:not]).map { |w| [w, false] }
42
+
43
+ (yes + no).each do |what, v|
44
+ valid = false
45
+ case what
46
+ when :config
47
+ valid = true if @config
48
+ when :steps_folder
49
+ valid = true if File.exist?(File.join(@config[:path], "steps"))
50
+ when :steps
51
+ valid = true if steps.length > 0
52
+ when :repo
53
+ valid = true if File.exist?(File.join(@config[:path], "repo"))
54
+ when :diff
55
+ valid = true if File.exist?(File.join(@config[:path], "steps.diff"))
56
+ else
57
+ raise NotImplementedError
58
+ end
28
59
 
29
- if !valid
30
- puts "Error: " + ERROR_MSG[what]
31
- exit!
60
+ if valid != v
61
+ puts "Error: " + ERROR_MSG[what][v.to_s.to_sym]
62
+ exit!
63
+ end
32
64
  end
33
65
  end
34
66
 
35
67
  def steps
36
- @steps ||= Dir[File.join(@config[:path], "*")].map do |f|
68
+ @steps ||= Dir[File.join(@config[:path], "steps/*")].map do |f|
37
69
  name = File.basename(f)
38
70
  name if File.directory?(f) && name =~ /\A\d+(\.\d+)*(-\w+)*\z/
39
71
  end.compact.sort_by { |s| s.split(".").map(&:to_i) }.reject { |s| s.to_i.zero? }
@@ -61,7 +93,7 @@ class Leg::Commands::BaseCommand
61
93
  end
62
94
 
63
95
  def step_path(step)
64
- File.join(@config[:path], step)
96
+ File.join(@config[:path], "steps", step)
65
97
  end
66
98
 
67
99
  def select_step(step, &block)
@@ -8,25 +8,20 @@ class Leg::Commands::Diff < Leg::Commands::BaseCommand
8
8
  end
9
9
 
10
10
  def run
11
- needs! :config
12
-
13
- if !File.exist?(File.join(@config[:path], "repo"))
14
- puts "Error: Not in repo mode!"
15
- exit!
16
- end
11
+ needs! :config, :repo
17
12
 
18
13
  FileUtils.cd(File.join(@config[:path], "repo")) do
19
14
  patches = `git format-patch --stdout -p --no-signature --root master`
20
15
  File.open("../steps.diff", "w") do |f|
21
16
  step_num = 1
22
17
  patches.each_line do |line|
23
- if line =~ /^(From|Date)/
18
+ if line =~ /^(From|Date|index)/
24
19
  # skip
25
- elsif line =~ /^Subject: \[[^\]]*\] (.*)$/
20
+ elsif line =~ /^Subject: \[[^\]]*\](.*)$/
26
21
  f << "\n" unless step_num == 1
27
- parts = $1.split('-')
28
- if parts.length >= 2
29
- f << "~~~ step: #{parts[1..-1].join('-')}\n"
22
+ step_name = $1.strip
23
+ if step_name =~ /^\w+(-\w+)*$/
24
+ f << "~~~ step: #{step_name}\n"
30
25
  else
31
26
  f << "~~~ step\n"
32
27
  end
@@ -0,0 +1,37 @@
1
+ class Leg::Commands::Ref < Leg::Commands::BaseCommand
2
+ def self.name
3
+ "ref"
4
+ end
5
+
6
+ def self.summary
7
+ "Convert a step number or name to a git commit reference"
8
+ end
9
+
10
+ def run
11
+ needs! :config, :repo
12
+
13
+ ref = @args.first
14
+ is_num = (ref =~ /\A\d+\z/)
15
+
16
+ FileUtils.cd(@config[:path]) do
17
+ repo = Rugged::Repository.new("repo")
18
+
19
+ walker = Rugged::Walker.new(repo)
20
+ walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
21
+ walker.push(repo.branches.find { |b| b.name == "master" }.target)
22
+ walker.each.with_index do |commit, idx|
23
+ step_num = (idx + 1).to_s
24
+ step_name = commit.message.lines.first.strip
25
+
26
+ if (is_num && ref == step_num) || (!is_num && ref == step_name)
27
+ puts commit.oid
28
+ exit
29
+ end
30
+ end
31
+
32
+ puts "Error: reference not found"
33
+ exit!
34
+ end
35
+ end
36
+ end
37
+
@@ -4,19 +4,14 @@ class Leg::Commands::Repo < Leg::Commands::BaseCommand
4
4
  end
5
5
 
6
6
  def self.summary
7
- "Convert step folders into a version controlled repository"
7
+ "Convert steps folder into a version controlled repository"
8
8
  end
9
9
 
10
10
  def run
11
- needs! :config
11
+ needs! :config, :steps_folder, :steps, not: :repo
12
12
 
13
13
  FileUtils.cd(@config[:path])
14
14
 
15
- if File.exist?("repo")
16
- puts "Error: A repo already exists!"
17
- exit!
18
- end
19
-
20
15
  FileUtils.mkdir("repo")
21
16
  repo = Rugged::Repository.init_at("repo")
22
17
 
@@ -35,106 +30,14 @@ class Leg::Commands::Repo < Leg::Commands::BaseCommand
35
30
 
36
31
  options = {}
37
32
  options[:tree] = index.write_tree(repo)
38
- options[:message] = step
33
+ options[:message] = step_name(step) || "-"
39
34
  options[:parents] = repo.empty? ? [] : [repo.head.target]
40
35
  options[:update_ref] = 'HEAD'
41
36
 
42
- commit_oid = Rugged::Commit.create(repo, options)
43
-
44
- tags = []
45
- if idx = step.index('-')
46
- tags << step[0...idx]
47
- tags << step[(idx+1)..-1]
48
- else
49
- tags << step
50
- end
51
-
52
- tags.each do |tag|
53
- repo.references.create("refs/tags/#{tag}", commit_oid)
54
- end
37
+ Rugged::Commit.create(repo, options)
55
38
  end
56
39
 
57
40
  repo.checkout_head(strategy: :force)
58
-
59
- File.write("repo/.git/hooks/post-commit", POST_COMMIT_HOOK)
60
- File.write("repo/.git/hooks/prepare-commit-msg", PREPARE_COMMIT_MSG_HOOK)
61
- File.write("repo/.git/hooks/post-rewrite", POST_REWRITE_HOOK)
62
- FileUtils.chmod(0755, "repo/.git/hooks/post-commit")
63
- FileUtils.chmod(0755, "repo/.git/hooks/prepare-commit-msg")
64
- FileUtils.chmod(0755, "repo/.git/hooks/post-rewrite")
65
-
66
- FileUtils.rm_r(steps)
67
41
  end
68
-
69
- POST_COMMIT_HOOK = <<~'EOF'
70
- #!/usr/bin/env ruby
71
-
72
- exit if File.exist?(File.join(ENV['GIT_DIR'], '.git/rebase-merge'))
73
-
74
- require 'rugged'
75
-
76
- repo = Rugged::Repository.discover
77
- commit = repo.head.target
78
- parts = commit.message.lines.first.strip.split('-').reject(&:empty?)
79
- tags = [parts.shift]
80
- tags << parts.join('-') unless parts.empty?
81
-
82
- tags.each do |tag|
83
- unless repo.tags[tag]
84
- repo.references.create("refs/tags/#{tag}", commit.oid)
85
- end
86
- end
87
- EOF
88
-
89
- PREPARE_COMMIT_MSG_HOOK = <<~'EOF'
90
- #!/usr/bin/env ruby
91
-
92
- exit if File.exist?(File.join(ENV['GIT_DIR'], '.git/rebase-merge'))
93
-
94
- msg = File.read(ARGV[0])
95
- exit if !msg.lines.first.strip.empty?
96
-
97
- require 'rugged'
98
-
99
- repo = Rugged::Repository.discover
100
- last_commit = repo.head.target
101
- step_num = nil
102
- repo.tags.each do |tag|
103
- if tag.name =~ /\A\d+(\.\d+)*\z/ && tag.target.oid == last_commit.oid
104
- step_num = tag.name
105
- break
106
- end
107
- end
108
-
109
- if step_num
110
- step_num = step_num.split('.')
111
- step_num[-1] = (step_num[-1].to_i + 1).to_s
112
- step_num = step_num.join('.')
113
-
114
- msg = File.read(ARGV[0])
115
- msg = "#{step_num}-#{msg}"
116
- File.write(ARGV[0], msg)
117
- end
118
- EOF
119
-
120
- POST_REWRITE_HOOK = <<~'EOF'
121
- #!/usr/bin/env ruby
122
-
123
- require 'rugged'
124
-
125
- repo = Rugged::Repository.discover
126
-
127
- tags = {}
128
- repo.tags.each do |tag|
129
- tags[tag.target.oid] = tag.name
130
- end
131
-
132
- while line = $stdin.gets
133
- old_sha1, new_sha1 = line.split
134
- if tags[old_sha1]
135
- repo.references.update("refs/tags/#{tags[old_sha1]}", new_sha1)
136
- end
137
- end
138
- EOF
139
42
  end
140
43
 
@@ -4,57 +4,45 @@ class Leg::Commands::Undiff < Leg::Commands::BaseCommand
4
4
  end
5
5
 
6
6
  def self.summary
7
- "Conver steps.diff to step folders"
7
+ "Convert steps.diff to steps folder"
8
8
  end
9
9
 
10
10
  def run
11
- needs! :config
11
+ needs! :config, :diff, not: :steps_folder
12
12
 
13
13
  FileUtils.cd(@config[:path]) do
14
- if !File.exist?("steps.diff")
15
- puts "Error: steps.diff doesn't exist!"
16
- exit!
17
- end
18
-
19
- if !steps.empty?
20
- puts "Error: Step folders already exist!"
21
- exit!
22
- end
23
-
24
- if File.exist?("repo")
25
- puts "Error: In repo mode!"
26
- exit!
27
- end
28
-
29
- File.open("steps.diff", "r") do |f|
30
- step_num = 0
31
- step_dir = nil
32
- prev_dir = nil
33
- cur_diff = nil
34
- while line = f.gets
35
- if line =~ /^~~~ step(: \w+(-\w+)*)?$/
36
- if cur_diff
37
- apply_diff(step_dir, cur_diff)
38
- cur_diff = nil
39
- end
40
-
41
- step_num += 1
42
- step_dir = step_num.to_s
43
- step_dir += "-#{$1[2..-1]}" if $1
44
- if step_num == 1
45
- FileUtils.mkdir(step_dir)
46
- else
47
- FileUtils.cp_r(prev_dir, step_dir)
14
+ FileUtils.mkdir("steps")
15
+ FileUtils.cd("steps") do
16
+ File.open("../steps.diff", "r") do |f|
17
+ step_num = 0
18
+ step_dir = nil
19
+ prev_dir = nil
20
+ cur_diff = nil
21
+ while line = f.gets
22
+ if line =~ /^~~~ step(: \w+(-\w+)*)?$/
23
+ if cur_diff
24
+ apply_diff(step_dir, cur_diff)
25
+ cur_diff = nil
26
+ end
27
+
28
+ step_num += 1
29
+ step_dir = step_num.to_s
30
+ step_dir += "-#{$1[2..-1]}" if $1
31
+ if step_num == 1
32
+ FileUtils.mkdir(step_dir)
33
+ else
34
+ FileUtils.cp_r(prev_dir, step_dir)
35
+ end
36
+ prev_dir = step_dir
37
+ elsif line =~ /^diff --git/
38
+ apply_diff(step_dir, cur_diff) if cur_diff
39
+ cur_diff = line
40
+ elsif cur_diff
41
+ cur_diff << line
48
42
  end
49
- prev_dir = step_dir
50
- elsif line =~ /^diff --git/
51
- apply_diff(step_dir, cur_diff) if cur_diff
52
- cur_diff = line
53
- elsif cur_diff
54
- cur_diff << line
55
43
  end
44
+ apply_diff(step_dir, cur_diff) if cur_diff
56
45
  end
57
- apply_diff(step_dir, cur_diff) if cur_diff
58
46
  end
59
47
  end
60
48
  end
@@ -4,39 +4,34 @@ class Leg::Commands::Unrepo < Leg::Commands::BaseCommand
4
4
  end
5
5
 
6
6
  def self.summary
7
- "Convert repository into step folders"
7
+ "Convert repository into steps folder"
8
8
  end
9
9
 
10
10
  def run
11
- needs! :config
11
+ needs! :config, :repo, not: :steps_folder
12
12
 
13
- FileUtils.cd(@config[:path])
13
+ FileUtils.cd(@config[:path]) do
14
+ FileUtils.mkdir("steps")
14
15
 
15
- if !File.exist?("repo")
16
- puts "Error: repo folder doesn't exist!"
17
- exit!
18
- end
16
+ repo = Rugged::Repository.new("repo")
19
17
 
20
- repo = Rugged::Repository.new("repo")
18
+ walker = Rugged::Walker.new(repo)
19
+ walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
20
+ walker.push(repo.branches.find { |b| b.name == "master" }.target)
21
+ walker.each.with_index do |commit, idx|
22
+ step_num = (idx + 1).to_s
23
+ step_name = commit.message.lines.first.strip
21
24
 
22
- walker = Rugged::Walker.new(repo)
23
- walker.sorting(Rugged::SORT_TOPO | Rugged::SORT_REVERSE)
24
- walker.push(repo.branches.find { |b| b.name == "master" }.target)
25
- walker.each.with_index do |commit, idx|
26
- step = (idx + 1).to_s
27
- step_name = step
25
+ if step_name.empty?
26
+ step = step_num
27
+ else
28
+ step = "#{step_num}-#{step_name}"
29
+ end
28
30
 
29
- parts = commit.message.lines.first.strip.split('-')
30
- if parts.length >= 2
31
- step_name += "-#{parts[1..-1].join('-')}"
31
+ repo.checkout(commit.oid, strategy: :force,
32
+ target_directory: step_path(step))
32
33
  end
33
-
34
- step_path = File.join(@config[:path], step_name)
35
-
36
- repo.checkout(commit.oid, strategy: :force, target_directory: step_path)
37
34
  end
38
-
39
- FileUtils.rm_r("repo")
40
35
  end
41
36
  end
42
37
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oleg
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Ruten
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-07 00:00:00.000000000 Z
11
+ date: 2017-03-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rugged
@@ -39,6 +39,7 @@ files:
39
39
  - lib/leg/commands/diff.rb
40
40
  - lib/leg/commands/help.rb
41
41
  - lib/leg/commands/pieces.rb
42
+ - lib/leg/commands/ref.rb
42
43
  - lib/leg/commands/repo.rb
43
44
  - lib/leg/commands/undiff.rb
44
45
  - lib/leg/commands/unrepo.rb