git-hack 0.0.2 → 0.0.3

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.
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require (File.expand_path('../../lib/git-hack', __FILE__))
4
+
5
+ GitHack::GitRepo.new(".").git_goto(ARGV.first)
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require (File.expand_path('../../lib/git-hack', __FILE__))
4
+
5
+ GitHack::GitRepo.new(".").redo
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require (File.expand_path('../../lib/git-hack', __FILE__))
4
+
5
+ GitHack::GitRepo.new(".").undo
@@ -23,5 +23,8 @@ module Git
23
23
  # putsrocess_commit_data(full_log)
24
24
  process_commit_data(full_log,"commit")
25
25
  end
26
+ def command_lines_patch(command,opt = [],chdir = true,redirect = '')
27
+ command_lines(command,opt,chdir,redirect)
28
+ end
26
29
  end
27
30
  end
@@ -8,13 +8,16 @@ class LineBuilder
8
8
  @data = data
9
9
  @index = index
10
10
  @object = nil
11
+ @is_parse = false
11
12
  end
12
13
  def parse
14
+ @is_parse = true
15
+ return nil if is_over?
13
16
  begin
14
17
  next unless in?
15
18
  process_line
16
- end until ( out? )
17
- @object
19
+ end until ( out? || is_over?)
20
+ self
18
21
  end
19
22
  # 行处理函数,必须被重写
20
23
  def process_line
@@ -29,4 +32,24 @@ class LineBuilder
29
32
  def out?
30
33
  @index += 1
31
34
  end
35
+ # 是否数据结构
36
+ def is_over?
37
+ @index >= @data.size
38
+ end
39
+ def get_next
40
+ return nil if is_over?
41
+ return self.class.new(@data,@index).parse
42
+ end
43
+ # 得出剩下的
44
+ def rest
45
+ return [] if is_over?
46
+ next_b = get_next
47
+ return [next_b] + ( next_b.is_over? ? [] : next_b.rest)
48
+ end
49
+ # 找出全部的
50
+ def find_all
51
+ return [] if is_over? && @object == nil
52
+ parse unless @is_parse
53
+ [self] + rest
54
+ end
32
55
  end
@@ -1,6 +1,6 @@
1
1
  require "git-hack/version"
2
- Dir["#{File.dirname(__FILE__)}/**/*.rb"].each { |f| require f }
3
2
  require "git"
3
+ Dir["#{File.dirname(__FILE__)}/**/*.rb"].each { |f| require f }
4
4
 
5
5
  module GitHack
6
6
  def self.current
@@ -1,34 +1,55 @@
1
1
 
2
2
  require_relative "../core_ext/line_builder"
3
+ class String
4
+ def uncolorize
5
+ self.gsub(/\e\[(\d+)*m/,"")
6
+ end
7
+ end
3
8
 
4
9
 
5
10
  module GitHack
6
11
  class CommitLineBuilder < LineBuilder
12
+ attr_accessor :commit
7
13
  def initialize(data,index)
8
14
  super(data,index)
9
15
  @is_message = false
10
- @commit = { 'masseg' => '', parent => []}
16
+ @commit = { 'sha'=>nil, 'message' => '', 'parent' => [] }
17
+ @is_next_commit = false
11
18
  end
12
19
  def process_line
13
20
  @is_message
14
21
  line = @data[@index]
15
- line = line.chomp
22
+ line = line.chomp.uncolorize
16
23
  if line == ""
17
24
  @is_message = !@is_message
18
- elsif is_message
19
- @commit.message << line+"\n"
25
+ elsif @is_message
26
+ @commit['message'] << line+"\n"
20
27
  else
21
28
  data = line.split
22
- key = data.shift
23
- value = data.join(" ")
24
- if key == 'commit'
25
- @commit['sha'] = value
26
- end
27
- if key == 'parent'
28
- @commit[key] << value
29
+ @key = key = data.shift
30
+ @value = data.join(" ")
31
+
32
+ if @key == "commit"
33
+ if @commit['sha']
34
+ @is_next_commit = true
35
+ else
36
+ @commit['sha'] = @value
37
+ end
38
+ elsif @key == 'parent'
39
+ @commit[@key] << @value
29
40
  else
41
+ @commit[@key] = @value
30
42
  end
31
43
  end
44
+ @object = @commit
45
+ end
46
+ def out?
47
+ if @is_next_commit
48
+ return true
49
+ else
50
+ @index += 1
51
+ return false
52
+ end
32
53
  end
33
54
  end
34
55
  end
@@ -13,7 +13,7 @@ module GitHack
13
13
  #
14
14
  class GitRepo < Git::Path
15
15
  include PathCommon
16
- attr_accessor :git,:commits,:work,:remote
16
+ attr_accessor :git,:commits,:work,:remote,:current_commit
17
17
  def initialize(path)
18
18
  @workingdirectory = get_gitdir(path)
19
19
  @commits = []
@@ -22,8 +22,11 @@ module GitHack
22
22
  @git ||= Git.open(@workingdirectory ,:log => Logger.new(STDOUT))
23
23
  end
24
24
  def commits
25
- @commits if !@commits.empty?
26
- @commits = git.log
25
+ return @commits if !@commits.empty?
26
+ l = Git::Lib.new(git)
27
+ opts = ["--pretty=raw"]
28
+ @data = l.command_lines_patch('log',opts)
29
+ return @commits = CommitLineBuilder.new(@data,0).find_all
27
30
  end
28
31
  # 得到本身或是上层目录中.git文件的路经
29
32
  def get_gitdir(path)
@@ -67,32 +70,72 @@ module GitHack
67
70
  def auto_commit_msg
68
71
  "auto commit" # TODO: 需要完成
69
72
  end
70
- # undo 如果有修改,保存,然后回到上一次提交
73
+ # undo 回到上一次提交
71
74
  def undo
72
- git_save if working_directory_change?
73
- checkout(1) # check_out 0.当前1.上一个.2.上上个....
75
+ git_goto(1)
74
76
  end
75
- # check out 出前第number个保存
76
- def checkout(number,options={})
77
+ # redo 到当前提交的下一个提交
78
+ def redo
77
79
  ready_to_execute
78
80
  return self if not_git_directory?
79
- puts "commits:".colorize(:red)
80
- ap commits
81
- git.reset(commits[1])
81
+ next_commit = get_next_commit
82
+ return self if !next_commit
83
+ git.reset_hard(next_commit)
82
84
  execute_success
83
85
  self
86
+ end
87
+ def git_goto(number,options={})
88
+ number = number.to_i
89
+ goto(number,options)
84
90
 
85
91
  end
92
+ # 回到前第number个保存
93
+ #
94
+ def goto(number,options={})
95
+ ready_to_execute
96
+ return self if not_git_directory?
97
+ git.reset_hard(commits[number].commit['sha'])
98
+ execute_success
99
+ self
100
+ end
86
101
  def init(dir)
87
102
  @git = Git.init(dir)
88
103
  @workingdirectory = dir
89
104
  end
90
105
  def not_git_directory?
91
106
  if @workingdirectory == nil
92
- puts "Init first,run git init"
107
+ puts "Not a git directory ,run `git init` first"
93
108
  return true
94
109
  end
95
110
  return false
96
111
  end
112
+ def get_next_commit
113
+ file = File.open("#{@workingdirectory}/.git/logs/HEAD")
114
+ data = []
115
+ file.each { |line|
116
+ data << line
117
+ }
118
+ commit_data = SimpleLineBuilder.new(data,0).find_all
119
+ commit = commit_data.find do |c|
120
+ c.object == current_commit
121
+ end
122
+ commit_sha = commit ? commit.value : nil
123
+ end
124
+ def current_commit
125
+ @current_commit if @current_commit
126
+ data = data_from_file("#{@workingdirectory}/.git/HEAD")
127
+ commit_file_data = SimpleLineBuilder.new(data,0).parse
128
+ commit_file = commit_file_data.value
129
+ @current_commit = data_from_file("#{@workingdirectory}/.git/#{commit_file}")
130
+ @current_commit = @current_commit[0].chomp
131
+ end
132
+ def data_from_file(path)
133
+ file = File.open(path)
134
+ data = []
135
+ file.each { |line|
136
+ data << line
137
+ }
138
+ data
139
+ end
97
140
  end
98
141
  end
@@ -0,0 +1,19 @@
1
+
2
+ require_relative "../core_ext/line_builder"
3
+
4
+ module GitHack
5
+ class SimpleLineBuilder < LineBuilder
6
+ attr_accessor :value
7
+ def initialize(data,index)
8
+ super(data,index)
9
+ end
10
+ def process_line
11
+ line = @data[@index]
12
+ line = line.chomp.split
13
+ @object = line.shift
14
+ @value = line.shift
15
+ end
16
+ end
17
+ end
18
+
19
+
@@ -1,3 +1,3 @@
1
1
  module GitHack
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -5,10 +5,47 @@ describe CommitLineBuilder do
5
5
  g = Git.open(".")
6
6
  l = Git::Lib.new(g)
7
7
  opts = ["--pretty=raw"]
8
- @data = l.command_lines('log',opts)
8
+ @data = l.command_lines_patch('log',opts)
9
9
  @linebuilder = CommitLineBuilder.new(@data,0)
10
10
  @linebuilder.parse
11
11
  end
12
12
  specify { @data.size.should be > 1 }
13
13
  specify { @linebuilder.object.should_not be nil }
14
+ specify { @linebuilder.is_over?.should_not be true }
15
+ specify { @linebuilder.get_next.should_not be nil }
16
+ specify { @linebuilder.rest.size.should be > 0 }
17
+ specify { @linebuilder.find_all.size.should be > 0 }
18
+ it "Show Some data" do
19
+ puts @linebuilder.index
20
+ puts @data.size
21
+ puts "find_all.size: #{@linebuilder.find_all.size}"
22
+
23
+ end
24
+ context "When come to the last " do
25
+ before do
26
+ @last = CommitLineBuilder.new(@data,@data.size-1)
27
+ @last.parse
28
+ end
29
+ specify { @last.should be_is_over }
30
+
31
+ specify { @last.get_next.should be nil }
32
+ specify { @last.rest.size.should be 0 }
33
+ specify { @last.find_all.size.should be 1 }
34
+ end
35
+ context "When is over" do
36
+ before do
37
+ @over = CommitLineBuilder.new(@data,@data.size)
38
+ @over.parse
39
+ end
40
+ specify { @over.should be_is_over }
41
+
42
+ specify { @over.get_next.should be nil }
43
+ specify { @over.rest.size.should be 0 }
44
+ specify { @over.find_all.size.should be 0 }
45
+ it "Show Find_all" do
46
+ # puts "lash find_all"
47
+ # ap @over.find_all
48
+ end
49
+ end
50
+
14
51
  end
@@ -65,25 +65,72 @@ describe GitRepo do
65
65
  after { del_dir(@dir) }
66
66
  end
67
67
  end # end of #git_save est
68
- describe "#checkout " do
68
+ describe "#goto " do
69
69
  before (:each) do
70
70
  @dir = dir_no_git
71
71
  refresh_dir(@dir)
72
72
  Git.init(@dir)
73
73
  @gitrepo = GitRepo.new(@dir)
74
74
  @gitrepo.get_gitdir(@dir)
75
+ add_for_commit("#{@dir}/file.txt")
76
+ @gitrepo.git_save("init")
77
+ add_for_commit("#{@dir}/newfile.txt")
78
+ @gitrepo.git_save("commit second")
75
79
  end
76
- context "When given 1,checkout to previous commitish" do
80
+ context "When given 1" do
77
81
  it "Should be success and no file newfile.txt" do
78
- puts "Now begin test checkou :#{@dir}"
79
- add_for_commit("#{@dir}/file.txt")
80
- @gitrepo.git_save("init")
81
- add_for_commit("#{@dir}/newfile.txt")
82
- @gitrepo.git_save("commit second")
83
- #@gitrepo.checkout(1).should be_success
84
- #File.exist?("#{@dir}/newfile.txt").should be false
82
+ @gitrepo.goto(1).should be_success
83
+ File.exist?("#{@dir}/newfile.txt").should be false
84
+ end
85
+ it "Should still get 2 commit" do
86
+ @gitrepo.commits.size.should == 2
87
+ @gitrepo.goto(1).should be_success
88
+ @gitrepo.commits.size.should == 2
89
+ @gitrepo.goto(0).should be_success
90
+ File.exist?("#{@dir}/newfile.txt").should be true
91
+ end
92
+ end
93
+ context "When given 2," do
94
+ it "Should goto the last commit" do
95
+ @gitrepo.goto(1).should be_success
96
+ File.exist?("#{@dir}/newfile.txt").should be false
97
+ @g = GitRepo.new(@dir)
98
+ @g.get_gitdir(@dir)
99
+ @gitrepo.goto(0).should be_success
100
+ File.exist?("#{@dir}/newfile.txt").should be true
85
101
  end
86
102
  end
87
103
  after { del_dir(@dir) }
88
104
  end #--end of #checkout
105
+ describe "#redo" do
106
+ before (:each) do
107
+ @dir = dir_no_git
108
+ refresh_dir(@dir)
109
+ Git.init(@dir)
110
+ @gitrepo = GitRepo.new(@dir)
111
+ @gitrepo.get_gitdir(@dir)
112
+ add_for_commit("#{@dir}/file.txt")
113
+ @gitrepo.git_save("init")
114
+ add_for_commit("#{@dir}/newfile.txt")
115
+ @gitrepo.git_save("commit second")
116
+ end
117
+ context "When no undo" do
118
+ it "Should be failed" do
119
+ @gitrepo.redo.should_not be_success
120
+ end
121
+ end
122
+ context "When undo first" do
123
+ it "Should be success" do
124
+ File.exist?("#{@dir}/newfile.txt").should be true
125
+ @gitrepo.undo
126
+ File.exist?("#{@dir}/newfile.txt").should be false
127
+ @g = GitRepo.new(@dir)
128
+ @g.get_gitdir(@dir)
129
+ @g.redo.should be_success
130
+ File.exist?("#{@dir}/newfile.txt").should be true
131
+ end
132
+ end
133
+ after{ del_dir(@dir) }
134
+ end
135
+
89
136
  end
@@ -4,12 +4,47 @@ describe LineBuilder do
4
4
  before do
5
5
  g = Git.open(".")
6
6
  l = Git::Lib.new(g)
7
+ @lib = l
7
8
  opts = ["--pretty=raw"]
8
- @data = l.command_lines('log',opts)
9
+ @data = l.command_lines_patch('log',opts)
9
10
  @linebuilder = LineBuilder.new(@data,0)
10
11
  @linebuilder.parse
11
12
  end
12
13
  specify { @data.size.should be > 1 }
13
14
  specify { @linebuilder.object.should_not be nil }
15
+ specify { @linebuilder.is_over?.should_not be true }
16
+ specify { @linebuilder.get_next.should_not be nil }
17
+ specify { @linebuilder.rest.size.should be > 0 }
18
+ specify { @linebuilder.find_all.size.should be > 0 }
19
+ it "Show Some data" do
20
+ puts @linebuilder.index
21
+ puts @data.size
22
+
23
+ end
24
+ context "When is come to the last" do
25
+ before do
26
+ @last = LineBuilder.new(@data,@data.size-1)
27
+ @last.parse
28
+ end
29
+ specify { @last.should be_is_over }
30
+
31
+ specify { @last.get_next.should be nil }
32
+ specify { @last.rest.size.should be 0 }
33
+ specify { @last.find_all.size.should be 1 }
34
+ end
35
+ context "When is over" do
36
+ before do
37
+ @over = LineBuilder.new(@data,@data.size)
38
+ @over.parse
39
+ end
40
+ specify { @over.should be_is_over }
14
41
 
42
+ specify { @over.get_next.should be nil }
43
+ specify { @over.rest.size.should be 0 }
44
+ specify { @over.find_all.size.should be 0 }
45
+ it "Show Find_all" do
46
+ # puts "lash find_all"
47
+ # ap @over.find_all
48
+ end
49
+ end
15
50
  end
@@ -0,0 +1,16 @@
1
+ class A
2
+ def selfclass
3
+ self.class
4
+ end
5
+ def get_next
6
+ selfclass.new
7
+ end
8
+ end
9
+ class B < A
10
+ end
11
+ a = A.new
12
+ b = B.new
13
+ puts a.class
14
+ puts a.selfclass.new
15
+ puts b.class
16
+ puts b.get_next
@@ -0,0 +1,3 @@
1
+ require "./coretest"
2
+
3
+
@@ -0,0 +1,3 @@
1
+ require "./cli"
2
+
3
+ puts "llllllllllll".hello
@@ -0,0 +1,8 @@
1
+
2
+ class String
3
+ def hello
4
+ puts "hello"
5
+ end
6
+ end
7
+
8
+
@@ -0,0 +1 @@
1
+ dlfdfld
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git-hack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-23 00:00:00.000000000 Z
12
+ date: 2012-02-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: colorize
16
- requirement: &79618330 !ruby/object:Gem::Requirement
16
+ requirement: &22140160 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *79618330
24
+ version_requirements: *22140160
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: git
27
- requirement: &79618070 !ruby/object:Gem::Requirement
27
+ requirement: &22139340 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,12 +32,15 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *79618070
35
+ version_requirements: *22139340
36
36
  description: A more smart tools of git. Come from git-smart
37
37
  email:
38
38
  - azhao.1981@gmail.com
39
39
  executables:
40
+ - git-goto
41
+ - git-redo
40
42
  - git-save
43
+ - git-undo
41
44
  extensions: []
42
45
  extra_rdoc_files: []
43
46
  files:
@@ -46,7 +49,10 @@ files:
46
49
  - Guardfile
47
50
  - README.md
48
51
  - Rakefile
52
+ - bin/git-goto
53
+ - bin/git-redo
49
54
  - bin/git-save
55
+ - bin/git-undo
50
56
  - commit test
51
57
  - git-hack.gemspec
52
58
  - lib/core_ext/git_patch.rb
@@ -56,14 +62,20 @@ files:
56
62
  - lib/git-hack/commit.rb
57
63
  - lib/git-hack/commit_line_builder.rb
58
64
  - lib/git-hack/git_repo.rb
65
+ - lib/git-hack/simple_line_builder.rb
59
66
  - lib/git-hack/version.rb
60
67
  - spec/commit_line_builder_spec.rb
61
68
  - spec/git_repo_spec.rb
62
69
  - spec/line_builder_spec.rb
63
70
  - spec/spec_helper.rb
64
71
  - spec/tmp/hello_for_rspec
72
+ - tmp/classtest.rb
73
+ - tmp/cli.rb
74
+ - tmp/cli2.rb
65
75
  - tmp/colorize_example.rb
76
+ - tmp/coretest.rb
66
77
  - tmp/gittest.rb
78
+ - tmp/hello
67
79
  - tmp/hello_for_rspec
68
80
  homepage: ''
69
81
  licenses: []