[前][次][番号順一覧][スレッド一覧]

ruby-changes:6548

From: nobu <ko1@a...>
Date: Mon, 14 Jul 2008 18:16:51 +0900 (JST)
Subject: [ruby-changes:6548] Ruby:r18064 (mvm): * tool/merge_from_trunk.rb: try to resolve ChangeLog conflicts

nobu	2008-07-14 18:16:35 +0900 (Mon, 14 Jul 2008)

  New Revision: 18064

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18064

  Log:
    * tool/merge_from_trunk.rb: try to resolve ChangeLog conflicts
      automatically if possible.

  Modified files:
    branches/mvm/ChangeLog
    branches/mvm/tool/merge_from_trunk.rb

Index: mvm/ChangeLog
===================================================================
--- mvm/ChangeLog	(revision 18063)
+++ mvm/ChangeLog	(revision 18064)
@@ -1,3 +1,8 @@
+Mon Jul 14 18:16:32 2008  Nobuyoshi Nakada  <nobu@r...>
+
+	* tool/merge_from_trunk.rb: try to resolve ChangeLog conflicts
+	  automatically if possible.
+
 Fri Jul 11 16:45:20 2008  Nobuyoshi Nakada  <nobu@r...>
 
 	* Makefile.in (gvar): make global/static variables list.
Index: mvm/tool/merge_from_trunk.rb
===================================================================
--- mvm/tool/merge_from_trunk.rb	(revision 18063)
+++ mvm/tool/merge_from_trunk.rb	(revision 18064)
@@ -1,6 +1,7 @@
 #!/usr/bin/ruby
 
 ENV["LC_MESSAGES"] = ENV["LC_ALL"] = "C"
+ChangeLog = "ChangeLog"
 
 if ARGV[0] == "--commit"
   ARGV.shift
@@ -14,10 +15,73 @@
   puts "merging r#{old_revision}:#{new_revision}"
   IO.foreach("|svn merge #{TRUNK}@#{old_revision} #{TRUNK}@#{new_revision} .") do |line|
     puts line
-    conflicts << line[6..-2] if /^C/ =~ line
+    conflicts << line[5..-2] if /^C/ =~ line
   end
   File.open(".merged-trunk-revision", "wb") {|f| f.puts new_revision}
 end
+if conflicts.include?(ChangeLog)
+  require 'date'
+  puts "resolving #{ChangeLog}"
+  CONFLICT_BEGIN = "\n<<<<<<<"
+  CONFLICT_SEP = "\n======="
+  CONFLICT_END = "\n>>>>>>>"
+  LOGENTRY_PAT = /([A-Z][a-z]{2} [A-Z][a-z]{2} [ 1-9]\d \d\d:\d\d:\d\d \d{4})  .*>(?:\n(?:\t.*)?)+\n\n/
+  newlog = ChangeLog + ".new"
+  if open(ChangeLog) do |fi|
+      class << fi
+        def split_entry(ents)
+          results = []
+          unless ents.empty?
+            ents.scan(/\G(#{LOGENTRY_PAT}|[.\n]+\z)/o) do |ent, time|
+              time or return
+              results << [(time and DateTime.parse(time)), ent]
+            end
+          end
+          results
+        end
+        def each_hunk
+          while line = self.gets
+            if /^<<<<<<</ =~ line
+              before = ""
+            else
+              before = self.gets(CONFLICT_BEGIN)
+              before[0, 0] = line
+              unless before.chomp!(CONFLICT_BEGIN)
+                yield before, nil, nil
+                break
+              end
+              self.gets
+            end
+            working = self.gets(CONFLICT_SEP) or return
+            working.chomp!(CONFLICT_SEP[1..-1]) and self.gets
+            working = split_entry(working) or return
+            merged = self.gets(CONFLICT_END) or return
+            merged.chomp!(CONFLICT_END[1..-1]) and self.gets
+            merged = split_entry(merged) or return
+            yield before, working, merged
+          end
+          true
+        end
+      end
+      open(newlog, "wb") do |fo|
+        fi.each_hunk do |before, working, merged|
+          fo.print before
+          if working
+            until working.empty? or merged.empty?
+              fo.print((merged.first[0] > working.first[0] ? merged : working).shift[1])
+            end
+            working.each {|i| fo.print i[1]}
+            merged.each {|i| fo.print i[1]}
+          end
+        end
+      end
+    end
+    File.rename(newlog, ChangeLog)
+    if system("svn", "resolved", ChangeLog)
+      conflicts.delete(ChangeLog)
+    end
+  end
+end
 unless conflicts.empty?
   abort "conflicted #{conflicts.size}"
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]