rake_commit 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/rake_commit CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require File.expand_path(File.dirname(__FILE__) + "/../lib/commit")
3
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/rake_commit")
4
4
 
5
- Commit.new.commit
5
+ RakeCommit::Commit.new.commit
@@ -0,0 +1,60 @@
1
+ require 'optparse'
2
+ require 'rexml/document'
3
+
4
+ module RakeCommit
5
+ class Commit
6
+ def git?
7
+ `git symbolic-ref HEAD 2>/dev/null`
8
+ $?.success?
9
+ end
10
+
11
+ def git_svn?
12
+ `git svn info 2> /dev/null`
13
+ $?.success?
14
+ end
15
+
16
+ def commit
17
+ options = {
18
+ :collapse_commits => true,
19
+ :incremental => false,
20
+ :prompt_exclusions => []
21
+ }
22
+
23
+ if File.exists?(".rake_commit")
24
+ defaults = File.read(".rake_commit")
25
+ options = parse_options(defaults.split(" "), options)
26
+ end
27
+ options = parse_options(ARGV, options)
28
+
29
+ if git_svn?
30
+ RakeCommit::GitSvn.new(options[:prompt_exclusions]).commit
31
+ elsif git?
32
+ RakeCommit::Git.new(options[:collapse_commits], options[:incremental], options[:prompt_exclusions]).commit
33
+ else
34
+ RakeCommit::Svn.new(options[:prompt_exclusions]).commit
35
+ end
36
+ end
37
+
38
+ def parse_options(args, options)
39
+ parser = OptionParser.new do |opts|
40
+ opts.banner = "Usage: rake_commit [OPTIONS]"
41
+ opts.on("-h", "--help", "Show this message") do
42
+ puts opts
43
+ exit
44
+ end
45
+ opts.on("-i", "--incremental", "Prompt for a local commit") do
46
+ options[:incremental] = true
47
+ end
48
+ opts.on("-n", "--no-collapse", "Run the build and push without collapsing commits") do
49
+ options[:collapse_commits] = false
50
+ end
51
+ opts.on("-w", "--without-prompt PROMPT", "Skips the given prompt (author, feature, message)") do |prompt_exclusion|
52
+ options[:prompt_exclusions] << prompt_exclusion
53
+ end
54
+ end
55
+
56
+ parser.parse(args)
57
+ options
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,16 @@
1
+ module RakeCommit
2
+ class CommitMessage
3
+
4
+ attr_reader :pair, :feature, :message
5
+
6
+ def initialize(prompt_exclusions = [])
7
+ @pair = RakeCommit::PromptLine.new("pair", prompt_exclusions).prompt
8
+ @feature = RakeCommit::PromptLine.new("feature", prompt_exclusions).prompt
9
+ @message = RakeCommit::PromptLine.new("message", prompt_exclusions).prompt
10
+ end
11
+
12
+ def joined_message
13
+ [@pair, @feature, @message].compact.join(' - ')
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,27 @@
1
+ require 'rexml/document'
2
+ require "open-uri"
3
+
4
+ module RakeCommit
5
+ class CruiseStatus
6
+
7
+ def initialize(feed_url)
8
+ project_feed = open(feed_url).read
9
+ @doc = REXML::Document.new(project_feed)
10
+ rescue Exception => e
11
+ @failures = [e.message]
12
+ @doc = REXML::Document.new("")
13
+ end
14
+
15
+ def pass?
16
+ failures.empty?
17
+ end
18
+
19
+ def failures
20
+ @failures ||= REXML::XPath.match(@doc, "//item/title").select { |element|
21
+ element.text =~ /failed$/
22
+ }.map do |element|
23
+ element.text.gsub( /(.*) build (.+) failed$/, '\1' )
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,92 @@
1
+ module RakeCommit
2
+ class Git
3
+
4
+ def initialize(collapse_commits = true, incremental = false, prompt_exclusions = [])
5
+ @collapse_commits = collapse_commits
6
+ @incremental = incremental
7
+ @prompt_exclusions = prompt_exclusions
8
+ end
9
+
10
+ def commit
11
+ if @incremental
12
+ incremental_commit
13
+ else
14
+ collapse_git_commits if @collapse_commits && collapse_git_commits?
15
+ RakeCommit::Shell.system("rake")
16
+ push
17
+ end
18
+ end
19
+
20
+ def collapse_git_commits?
21
+ return true unless merge_commits?
22
+ status
23
+ input = Readline.readline("Do you want to collapse merge commits? (y/n): ").chomp
24
+ input == "y"
25
+ end
26
+
27
+ def collapse_git_commits
28
+ add
29
+ temp_commit
30
+ reset_soft
31
+ status
32
+ return if nothing_to_commit?
33
+ incremental_commit
34
+ pull_rebase
35
+ end
36
+
37
+ def status
38
+ RakeCommit::Shell.system("git status", false)
39
+ end
40
+
41
+ def add
42
+ RakeCommit::Shell.system "git add -A ."
43
+ end
44
+
45
+ def incremental_commit
46
+ commit_message = RakeCommit::CommitMessage.new(@prompt_exclusions)
47
+ unless commit_message.pair.nil?
48
+ RakeCommit::Shell.system("git config user.name #{commit_message.pair.inspect}")
49
+ end
50
+ message = [commit_message.feature, commit_message.message].compact.join(" - ")
51
+ RakeCommit::Shell.system("git commit -m #{message.inspect}")
52
+ end
53
+
54
+ def reset_soft
55
+ raise "Could not determine branch" unless git_branch
56
+ RakeCommit::Shell.system "git reset --soft #{merge_base}"
57
+ end
58
+
59
+ def pull_rebase
60
+ RakeCommit::Shell.system "git pull --rebase"
61
+ end
62
+
63
+ def push
64
+ RakeCommit::Shell.system "git push origin #{git_branch}"
65
+ end
66
+
67
+ def temp_commit
68
+ return if nothing_to_commit?
69
+ RakeCommit::Shell.system "git commit -m 'rake_commit backup commit'"
70
+ end
71
+
72
+ def nothing_to_commit?
73
+ status = RakeCommit::Shell.backtick("git status", false)
74
+ status.empty? || status =~ /nothing to commit/m
75
+ end
76
+
77
+ def git_branch
78
+ @git_branch ||= begin
79
+ output = RakeCommit::Shell.backtick("git symbolic-ref HEAD")
80
+ output.gsub('refs/heads/', '').strip
81
+ end
82
+ end
83
+
84
+ def merge_commits?
85
+ RakeCommit::Shell.backtick("git log #{merge_base}..HEAD") != RakeCommit::Shell.backtick("git log --no-merges #{merge_base}..HEAD")
86
+ end
87
+
88
+ def merge_base
89
+ @merge_base ||= RakeCommit::Shell.backtick("git merge-base #{git_branch} origin/#{git_branch}").strip
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,30 @@
1
+ module RakeCommit
2
+ class GitSvn
3
+ def initialize(prompt_exclusions = [])
4
+ @prompt_exclusions = prompt_exclusions
5
+ end
6
+
7
+ def commit
8
+ git = RakeCommit::Git.new
9
+ git.add
10
+ git.status
11
+ git_svn_commit_with_message
12
+ rebase
13
+ RakeCommit::Shell.system "rake"
14
+ dcommit
15
+ end
16
+
17
+ def git_svn_commit_with_message
18
+ message = RakeCommit::CommitMessage.new(@prompt_exclusions).joined_message
19
+ RakeCommit::Shell.system "git commit -m #{message.inspect}"
20
+ end
21
+
22
+ def rebase
23
+ RakeCommit::Shell.system "git svn rebase"
24
+ end
25
+
26
+ def dcommit
27
+ RakeCommit::Shell.system "git svn dcommit"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ require 'readline'
2
+ require 'tmpdir'
3
+
4
+ module RakeCommit
5
+ class PromptLine
6
+
7
+ def initialize(attribute, prompt_exclusions = [])
8
+ @attribute = attribute
9
+ @prompt_exclusions = prompt_exclusions
10
+ end
11
+
12
+ def prompt
13
+ return nil if @prompt_exclusions.include?(@attribute)
14
+ input = nil
15
+ loop do
16
+ input = Readline.readline(message).chomp
17
+ break unless (input.empty? && saved_data.empty?)
18
+ end
19
+
20
+ unless input.empty?
21
+ save(input)
22
+ return input
23
+ end
24
+
25
+ puts "using: #{saved_data}"
26
+ return saved_data
27
+ end
28
+
29
+ def message
30
+ previous = saved_data
31
+ previous_message = "\n"
32
+ previous_message += "previous #{@attribute}: #{previous}\n" unless previous.empty?
33
+ puts previous_message
34
+ "#{@attribute}: "
35
+ end
36
+
37
+ def save(input)
38
+ File.open(path(@attribute), "w") {|f| f.write(input) }
39
+ end
40
+
41
+ private
42
+ def saved_data
43
+ @saved_data ||= File.exists?(path(@attribute)) ? File.read(path(@attribute)) : ""
44
+ end
45
+
46
+ def path(attribute)
47
+ File.expand_path(Dir.tmpdir + "/#{attribute}.data")
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,16 @@
1
+ require 'English'
2
+
3
+ module RakeCommit
4
+ class Shell
5
+ def self.system(cmd, raise_on_failure = true)
6
+ successful = Kernel.system(cmd)
7
+ raise if raise_on_failure && !successful
8
+ end
9
+
10
+ def self.backtick(cmd, raise_on_failure = true)
11
+ output = `#{cmd}`
12
+ raise "Command failed: #{cmd.inspect}" if raise_on_failure && !$CHILD_STATUS.success?
13
+ output
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,82 @@
1
+ require 'fileutils'
2
+
3
+ module RakeCommit
4
+ class Svn
5
+
6
+ def initialize(prompt_exclusions = [])
7
+ @prompt_exclusions = prompt_exclusions
8
+ end
9
+
10
+ def commit
11
+ if files_to_check_in?
12
+ message = RakeCommit::CommitMessage.new(@prompt_exclusions).joined_message
13
+ add
14
+ delete
15
+ up
16
+ RakeCommit::Shell.system "rake"
17
+ output = RakeCommit::Shell.backtick "#{commit_command(message)}"
18
+ puts output
19
+ revision = output.match(/Committed revision (\d+)\./)[1]
20
+ else
21
+ puts "Nothing to commit"
22
+ end
23
+ end
24
+
25
+ def commit_command(message)
26
+ "svn ci -m #{message.inspect}"
27
+ end
28
+
29
+ def files_to_check_in?
30
+ RakeCommit::Shell.backtick("svn st --ignore-externals").split("\n").reject {|line| line[0,1] == "X"}.any?
31
+ end
32
+
33
+ def status
34
+ RakeCommit::Shell.system "svn st"
35
+ end
36
+
37
+ def up
38
+ output = RakeCommit::Shell.backtick "svn up"
39
+ puts output
40
+ output.split("\n").each do |line|
41
+ raise "SVN conflict detected. Please resolve conflicts before proceeding." if line[0,1] == "C"
42
+ end
43
+ end
44
+
45
+ def add
46
+ RakeCommit::Shell.backtick("svn st").split("\n").each do |line|
47
+ if new_file?(line) && !svn_conflict_file?(line)
48
+ file = line[7..-1].strip
49
+ RakeCommit::Shell.system "svn add #{file.inspect}"
50
+ end
51
+ end
52
+ end
53
+
54
+ def new_file?(line)
55
+ line[0,1] == "?"
56
+ end
57
+
58
+ def svn_conflict_file?(line)
59
+ line =~ /\.r\d+$/ || line =~ /\.mine$/
60
+ end
61
+
62
+ def delete
63
+ RakeCommit::Shell.backtick("svn st").split("\n").each do |line|
64
+ if line[0,1] == "!"
65
+ file = line[7..-1].strip
66
+ RakeCommit::Shell.backtick "svn up #{file.inspect} && svn rm #{file.inspect}"
67
+ puts %[removed #{file}]
68
+ end
69
+ end
70
+ end
71
+
72
+ def revert_all
73
+ RakeCommit::Shell.system "svn revert -R ."
74
+ RakeCommit::Shell.backtick("svn st").split("\n").each do |line|
75
+ next unless line[0,1] == '?'
76
+ filename = line[1..-1].strip
77
+ puts "removed #{filename}"
78
+ FileUtils.rm_r filename
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,6 @@
1
+ module RakeCommit
2
+ end
3
+
4
+ Dir.glob(File.expand_path(File.dirname(__FILE__) + '/rake_commit/*.rb')) do |file|
5
+ require file
6
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rake_commit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-25 00:00:00.000000000 Z
12
+ date: 2012-10-17 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: See http://github.com/pgr0ss/rake_commit
15
15
  email: pgross@gmail.com
@@ -20,16 +20,16 @@ extra_rdoc_files: []
20
20
  files:
21
21
  - README.rdoc
22
22
  - Rakefile
23
- - lib/commit.rb
24
- - lib/commit_message.rb
25
- - lib/cruise_status.rb
26
- - lib/git.rb
27
- - lib/git_svn.rb
28
- - lib/prompt_line.rb
29
- - lib/shell.rb
30
- - lib/svn.rb
31
- - !binary |-
32
- YmluL3Jha2VfY29tbWl0
23
+ - lib/rake_commit/commit.rb
24
+ - lib/rake_commit/commit_message.rb
25
+ - lib/rake_commit/cruise_status.rb
26
+ - lib/rake_commit/git.rb
27
+ - lib/rake_commit/git_svn.rb
28
+ - lib/rake_commit/prompt_line.rb
29
+ - lib/rake_commit/shell.rb
30
+ - lib/rake_commit/svn.rb
31
+ - lib/rake_commit.rb
32
+ - bin/rake_commit
33
33
  homepage: http://github.com/pgr0ss/rake_commit
34
34
  licenses: []
35
35
  post_install_message:
@@ -42,6 +42,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
42
42
  - - ! '>='
43
43
  - !ruby/object:Gem::Version
44
44
  version: '0'
45
+ segments:
46
+ - 0
47
+ hash: 3950958568738927598
45
48
  required_rubygems_version: !ruby/object:Gem::Requirement
46
49
  none: false
47
50
  requirements:
@@ -50,7 +53,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
53
  version: '0'
51
54
  requirements: []
52
55
  rubyforge_project: rake_commit
53
- rubygems_version: 1.8.21
56
+ rubygems_version: 1.8.24
54
57
  signing_key:
55
58
  specification_version: 3
56
59
  summary: A gem which helps with checking in code
data/lib/commit.rb DELETED
@@ -1,62 +0,0 @@
1
- require 'optparse'
2
- require 'rexml/document'
3
-
4
- Dir.glob(File.expand_path(File.dirname(__FILE__) + '/*.rb')) do |file|
5
- require file
6
- end
7
-
8
- class Commit
9
- def git?
10
- `git symbolic-ref HEAD 2>/dev/null`
11
- $?.success?
12
- end
13
-
14
- def git_svn?
15
- `git svn info 2> /dev/null`
16
- $?.success?
17
- end
18
-
19
- def commit
20
- options = {
21
- :collapse_commits => true,
22
- :incremental => false,
23
- :prompt_exclusions => []
24
- }
25
-
26
- if File.exists?(".rake_commit")
27
- defaults = File.read(".rake_commit")
28
- options = parse_options(defaults.split(" "), options)
29
- end
30
- options = parse_options(ARGV, options)
31
-
32
- if git_svn?
33
- GitSvn.new(options[:prompt_exclusions]).commit
34
- elsif git?
35
- Git.new(options[:collapse_commits], options[:incremental], options[:prompt_exclusions]).commit
36
- else
37
- Svn.new(options[:prompt_exclusions]).commit
38
- end
39
- end
40
-
41
- def parse_options(args, options)
42
- parser = OptionParser.new do |opts|
43
- opts.banner = "Usage: rake_commit [OPTIONS]"
44
- opts.on("-h", "--help", "Show this message") do
45
- puts opts
46
- exit
47
- end
48
- opts.on("-i", "--incremental", "Prompt for a local commit") do
49
- options[:incremental] = true
50
- end
51
- opts.on("-n", "--no-collapse", "Run the build and push without collapsing commits") do
52
- options[:collapse_commits] = false
53
- end
54
- opts.on("-w", "--without-prompt PROMPT", "Skips the given prompt (author, feature, message)") do |prompt_exclusion|
55
- options[:prompt_exclusions] << prompt_exclusion
56
- end
57
- end
58
-
59
- parser.parse(args)
60
- options
61
- end
62
- end
@@ -1,14 +0,0 @@
1
- class CommitMessage
2
-
3
- attr_reader :pair, :feature, :message
4
-
5
- def initialize(prompt_exclusions = [])
6
- @pair = PromptLine.new("pair", prompt_exclusions).prompt
7
- @feature = PromptLine.new("feature", prompt_exclusions).prompt
8
- @message = PromptLine.new("message", prompt_exclusions).prompt
9
- end
10
-
11
- def joined_message
12
- [@pair, @feature, @message].compact.join(' - ')
13
- end
14
- end
data/lib/cruise_status.rb DELETED
@@ -1,25 +0,0 @@
1
- require 'rexml/document'
2
- require "open-uri"
3
-
4
- class CruiseStatus
5
-
6
- def initialize(feed_url)
7
- project_feed = open(feed_url).read
8
- @doc = REXML::Document.new(project_feed)
9
- rescue Exception => e
10
- @failures = [e.message]
11
- @doc = REXML::Document.new("")
12
- end
13
-
14
- def pass?
15
- failures.empty?
16
- end
17
-
18
- def failures
19
- @failures ||= REXML::XPath.match(@doc, "//item/title").select { |element|
20
- element.text =~ /failed$/
21
- }.map do |element|
22
- element.text.gsub( /(.*) build (.+) failed$/, '\1' )
23
- end
24
- end
25
- end
data/lib/git.rb DELETED
@@ -1,90 +0,0 @@
1
- class Git
2
-
3
- def initialize(collapse_commits = true, incremental = false, prompt_exclusions = [])
4
- @collapse_commits = collapse_commits
5
- @incremental = incremental
6
- @prompt_exclusions = prompt_exclusions
7
- end
8
-
9
- def commit
10
- if @incremental
11
- incremental_commit
12
- else
13
- collapse_git_commits if @collapse_commits && collapse_git_commits?
14
- Shell.system("rake")
15
- push
16
- end
17
- end
18
-
19
- def collapse_git_commits?
20
- return true unless merge_commits?
21
- status
22
- input = Readline.readline("Do you want to collapse merge commits? (y/n): ").chomp
23
- input == "y"
24
- end
25
-
26
- def collapse_git_commits
27
- add
28
- temp_commit
29
- reset_soft
30
- status
31
- return if nothing_to_commit?
32
- incremental_commit
33
- pull_rebase
34
- end
35
-
36
- def status
37
- Shell.system("git status", false)
38
- end
39
-
40
- def add
41
- Shell.system "git add -A ."
42
- end
43
-
44
- def incremental_commit
45
- commit_message = CommitMessage.new(@prompt_exclusions)
46
- unless commit_message.pair.nil?
47
- Shell.system("git config user.name #{commit_message.pair.inspect}")
48
- end
49
- message = [commit_message.feature, commit_message.message].compact.join(" - ")
50
- Shell.system("git commit -m #{message.inspect}")
51
- end
52
-
53
- def reset_soft
54
- raise "Could not determine branch" unless git_branch
55
- Shell.system "git reset --soft #{merge_base}"
56
- end
57
-
58
- def pull_rebase
59
- Shell.system "git pull --rebase"
60
- end
61
-
62
- def push
63
- Shell.system "git push origin #{git_branch}"
64
- end
65
-
66
- def temp_commit
67
- return if nothing_to_commit?
68
- Shell.system "git commit -m 'rake_commit backup commit'"
69
- end
70
-
71
- def nothing_to_commit?
72
- status = Shell.backtick("git status", false)
73
- status.empty? || status =~ /nothing to commit/m
74
- end
75
-
76
- def git_branch
77
- @git_branch ||= begin
78
- output = Shell.backtick("git symbolic-ref HEAD")
79
- output.gsub('refs/heads/', '').strip
80
- end
81
- end
82
-
83
- def merge_commits?
84
- Shell.backtick("git log #{merge_base}..HEAD") != Shell.backtick("git log --no-merges #{merge_base}..HEAD")
85
- end
86
-
87
- def merge_base
88
- @merge_base ||= Shell.backtick("git merge-base #{git_branch} origin/#{git_branch}").strip
89
- end
90
- end
data/lib/git_svn.rb DELETED
@@ -1,28 +0,0 @@
1
- class GitSvn
2
- def initialize(prompt_exclusions = [])
3
- @prompt_exclusions = prompt_exclusions
4
- end
5
-
6
- def commit
7
- git = Git.new
8
- git.add
9
- git.status
10
- git_svn_commit_with_message
11
- rebase
12
- Shell.system "rake"
13
- dcommit
14
- end
15
-
16
- def git_svn_commit_with_message
17
- message = CommitMessage.new(@prompt_exclusions).joined_message
18
- Shell.system "git commit -m #{message.inspect}"
19
- end
20
-
21
- def rebase
22
- Shell.system "git svn rebase"
23
- end
24
-
25
- def dcommit
26
- Shell.system "git svn dcommit"
27
- end
28
- end
data/lib/prompt_line.rb DELETED
@@ -1,49 +0,0 @@
1
- require 'readline'
2
- require 'tmpdir'
3
-
4
- class PromptLine
5
-
6
- def initialize(attribute, prompt_exclusions = [])
7
- @attribute = attribute
8
- @prompt_exclusions = prompt_exclusions
9
- end
10
-
11
- def prompt
12
- return nil if @prompt_exclusions.include?(@attribute)
13
- input = nil
14
- loop do
15
- input = Readline.readline(message).chomp
16
- break unless (input.empty? && saved_data.empty?)
17
- end
18
-
19
- unless input.empty?
20
- save(input)
21
- return input
22
- end
23
-
24
- puts "using: #{saved_data}"
25
- return saved_data
26
- end
27
-
28
- def message
29
- previous = saved_data
30
- previous_message = "\n"
31
- previous_message += "previous #{@attribute}: #{previous}\n" unless previous.empty?
32
- puts previous_message
33
- "#{@attribute}: "
34
- end
35
-
36
- def save(input)
37
- File.open(path(@attribute), "w") {|f| f.write(input) }
38
- end
39
-
40
- private
41
- def saved_data
42
- @saved_data ||= File.exists?(path(@attribute)) ? File.read(path(@attribute)) : ""
43
- end
44
-
45
- def path(attribute)
46
- File.expand_path(Dir.tmpdir + "/#{attribute}.data")
47
- end
48
-
49
- end
data/lib/shell.rb DELETED
@@ -1,14 +0,0 @@
1
- require 'English'
2
-
3
- class Shell
4
- def self.system(cmd, raise_on_failure = true)
5
- successful = Kernel.system(cmd)
6
- raise if raise_on_failure && !successful
7
- end
8
-
9
- def self.backtick(cmd, raise_on_failure = true)
10
- output = `#{cmd}`
11
- raise "Command failed: #{cmd.inspect}" if raise_on_failure && !$CHILD_STATUS.success?
12
- output
13
- end
14
- end
data/lib/svn.rb DELETED
@@ -1,80 +0,0 @@
1
- require 'fileutils'
2
-
3
- class Svn
4
-
5
- def initialize(prompt_exclusions = [])
6
- @prompt_exclusions = prompt_exclusions
7
- end
8
-
9
- def commit
10
- if files_to_check_in?
11
- message = CommitMessage.new(@prompt_exclusions).joined_message
12
- add
13
- delete
14
- up
15
- Shell.system "rake"
16
- output = Shell.backtick "#{commit_command(message)}"
17
- puts output
18
- revision = output.match(/Committed revision (\d+)\./)[1]
19
- else
20
- puts "Nothing to commit"
21
- end
22
- end
23
-
24
- def commit_command(message)
25
- "svn ci -m #{message.inspect}"
26
- end
27
-
28
- def files_to_check_in?
29
- Shell.backtick("svn st --ignore-externals").split("\n").reject {|line| line[0,1] == "X"}.any?
30
- end
31
-
32
- def status
33
- Shell.system "svn st"
34
- end
35
-
36
- def up
37
- output = Shell.backtick "svn up"
38
- puts output
39
- output.split("\n").each do |line|
40
- raise "SVN conflict detected. Please resolve conflicts before proceeding." if line[0,1] == "C"
41
- end
42
- end
43
-
44
- def add
45
- Shell.backtick("svn st").split("\n").each do |line|
46
- if new_file?(line) && !svn_conflict_file?(line)
47
- file = line[7..-1].strip
48
- Shell.system "svn add #{file.inspect}"
49
- end
50
- end
51
- end
52
-
53
- def new_file?(line)
54
- line[0,1] == "?"
55
- end
56
-
57
- def svn_conflict_file?(line)
58
- line =~ /\.r\d+$/ || line =~ /\.mine$/
59
- end
60
-
61
- def delete
62
- Shell.backtick("svn st").split("\n").each do |line|
63
- if line[0,1] == "!"
64
- file = line[7..-1].strip
65
- Shell.backtick "svn up #{file.inspect} && svn rm #{file.inspect}"
66
- puts %[removed #{file}]
67
- end
68
- end
69
- end
70
-
71
- def revert_all
72
- Shell.system "svn revert -R ."
73
- Shell.backtick("svn st").split("\n").each do |line|
74
- next unless line[0,1] == '?'
75
- filename = line[1..-1].strip
76
- puts "removed #{filename}"
77
- FileUtils.rm_r filename
78
- end
79
- end
80
- end