lib/rim/sync_module_helper.rb in esr-rim-1.4.0 vs lib/rim/sync_module_helper.rb in esr-rim-1.4.2
- old
+ new
@@ -1,107 +1,107 @@
-require 'rim/module_helper'
-require 'rim/rim_info'
-require 'rim/file_helper'
-require 'rim/dirty_check'
-require 'tempfile'
-require 'pathname'
-
-module RIM
- class SyncModuleHelper < ModuleHelper
- def initialize(dest_root, workspace_root, module_info, logger)
- super(workspace_root, module_info, logger)
- @dest_root = dest_root
- end
-
- # do the local sync without committing
- def sync(message = nil)
- fetch_module
- export_module(message)
- end
-
- private
-
- # export +revision+ of +mod+ into working copy
- # BEWARE: any changes to the working copy target dir will be lost!
- def export_module(message)
- changes = false
- RIM::git_session(@dest_root) do |d|
- start_sha1 = d.rev_sha1("HEAD")
- git_path = module_git_path(@remote_path)
- RIM::git_session(git_path) do |s|
- if !s.rev_sha1(@module_info.target_revision)
- raise RimException.new("Unknown target revision '#{@module_info.target_revision}' for module '#{@module_info.local_path}'.")
- end
- local_path = File.join(@dest_root, @module_info.local_path)
- prepare_empty_folder(local_path, @module_info.ignores)
- temp_commit(d, "clear directory") if d.uncommited_changes?
- strip = ""
- if @module_info.subdir
- depth = Pathname(@module_info.subdir).each_filename.count()
- strip = "--strip-components=#{depth}"
- end
- s.execute("git archive --format tar #{@module_info.target_revision} #{@module_info.subdir} | tar #{strip} -x -C #{local_path}")
- sha1 = s.execute("git rev-parse #{@module_info.target_revision}").strip
- @rim_info = RimInfo.new
- @rim_info.remote_url = @module_info.remote_url
- @rim_info.target_revision = @module_info.target_revision
- @rim_info.revision_sha1 = sha1
- @rim_info.ignores = @module_info.ignores.join(",")
- @rim_info.subdir = @module_info.subdir
- @rim_info.infos = s.rev_infos(@module_info.target_revision, RimInfo.git_infos)
- @rim_info.to_dir(local_path)
- DirtyCheck.mark_clean(local_path)
- end
- temp_commit(d, "commit changes") if needs_commit?(d)
- d.execute("git reset --soft #{start_sha1}")
- changes = d.uncommited_changes?
- commit(d, message || "rim sync: module #{@module_info.local_path}") if changes
- end
- changes
- end
-
- def needs_commit?(session)
- # do we need to commit something?
- stat = session.status(@module_info.local_path)
- # no files should be ignored due to --force option. Anyway we will check for ignored files
- ignored = []
- session.execute("git add --all --force #{@module_info.local_path}") do |out, e|
- ignored = parse_ignored_files(session, out, e)
- end
- if ignored.empty?
- stat = session.status(@module_info.local_path)
- ignored = stat.lines.select{ |l| l.ignored? }
- end
- if !ignored.empty?
- messages = ["Sync failed due to files/dirs of #{@module_info.local_path} which are ignored by workspace's .gitignore:"]
- ignored.each do |l|
- messages.push(l.file)
- end
- raise RimException.new(messages)
- end
- stat.lines.any?
- end
-
- def temp_commit(session, message)
- session.execute("git add --all")
- session.execute("git commit -m \"#{message}\" --")
- end
-
- def parse_ignored_files(session, out, e)
- first_line = true
- ignored = []
- out.gsub(/warning:.*will be replaced.*\r?\n.*\r?\n/, '').split(/\r?\n/).each do |l|
- raise e || RimException.new("Cannot parse ignored files after git add:\n#{out}") if first_line && !l.include?(".gitignore")
- if File.exist?(File.expand_path(l, session.execute_dir))
- ignored_line = GitSession::Status::Line.new
- ignored_line.file = l
- ignored_line.istat = "!"
- ignored.push(ignored_line)
- end
- first_line = false
- end
- ignored
- end
-
- end
-
-end
+require 'rim/module_helper'
+require 'rim/rim_info'
+require 'rim/file_helper'
+require 'rim/dirty_check'
+require 'tempfile'
+require 'pathname'
+
+module RIM
+ class SyncModuleHelper < ModuleHelper
+ def initialize(dest_root, workspace_root, module_info, logger)
+ super(workspace_root, module_info, logger)
+ @dest_root = dest_root
+ end
+
+ # do the local sync without committing
+ def sync(message = nil)
+ fetch_module
+ export_module(message)
+ end
+
+ private
+
+ # export +revision+ of +mod+ into working copy
+ # BEWARE: any changes to the working copy target dir will be lost!
+ def export_module(message)
+ changes = false
+ RIM::git_session(@dest_root) do |d|
+ start_sha1 = d.rev_sha1("HEAD")
+ git_path = module_git_path(@remote_path)
+ RIM::git_session(git_path) do |s|
+ if !s.rev_sha1(@module_info.target_revision)
+ raise RimException.new("Unknown target revision '#{@module_info.target_revision}' for module '#{@module_info.local_path}'.")
+ end
+ local_path = File.join(@dest_root, @module_info.local_path)
+ prepare_empty_folder(local_path, @module_info.ignores)
+ temp_commit(d, "clear directory") if d.uncommited_changes?
+ strip = ""
+ if @module_info.subdir
+ depth = Pathname(@module_info.subdir).each_filename.count()
+ strip = "--strip-components=#{depth}"
+ end
+ s.execute("git archive --format tar #{@module_info.target_revision} #{@module_info.subdir} | tar #{strip} -C #{local_path} -xf -")
+ sha1 = s.execute("git rev-parse #{@module_info.target_revision}").strip
+ @rim_info = RimInfo.new
+ @rim_info.remote_url = @module_info.remote_url
+ @rim_info.target_revision = @module_info.target_revision
+ @rim_info.revision_sha1 = sha1
+ @rim_info.ignores = @module_info.ignores.join(",")
+ @rim_info.subdir = @module_info.subdir
+ @rim_info.infos = s.rev_infos(@module_info.target_revision, RimInfo.git_infos)
+ @rim_info.to_dir(local_path)
+ DirtyCheck.mark_clean(local_path)
+ end
+ temp_commit(d, "commit changes") if needs_commit?(d)
+ d.execute("git reset --soft #{start_sha1}")
+ changes = d.uncommited_changes?
+ commit(d, message || "rim sync: module #{@module_info.local_path}") if changes
+ end
+ changes
+ end
+
+ def needs_commit?(session)
+ # do we need to commit something?
+ stat = session.status(@module_info.local_path)
+ # no files should be ignored due to --force option. Anyway we will check for ignored files
+ ignored = []
+ session.execute("git add --all --force #{@module_info.local_path}") do |out, e|
+ ignored = parse_ignored_files(session, out, e)
+ end
+ if ignored.empty?
+ stat = session.status(@module_info.local_path)
+ ignored = stat.lines.select{ |l| l.ignored? }
+ end
+ if !ignored.empty?
+ messages = ["Sync failed due to files/dirs of #{@module_info.local_path} which are ignored by workspace's .gitignore:"]
+ ignored.each do |l|
+ messages.push(l.file)
+ end
+ raise RimException.new(messages)
+ end
+ stat.lines.any?
+ end
+
+ def temp_commit(session, message)
+ session.execute("git add --all")
+ session.execute("git commit -m \"#{message}\" --")
+ end
+
+ def parse_ignored_files(session, out, e)
+ first_line = true
+ ignored = []
+ out.gsub(/warning:.*will be replaced.*\r?\n.*\r?\n/, '').split(/\r?\n/).each do |l|
+ raise e || RimException.new("Cannot parse ignored files after git add:\n#{out}") if first_line && !l.include?(".gitignore")
+ if File.exist?(File.expand_path(l, session.execute_dir))
+ ignored_line = GitSession::Status::Line.new
+ ignored_line.file = l
+ ignored_line.istat = "!"
+ ignored.push(ignored_line)
+ end
+ first_line = false
+ end
+ ignored
+ end
+
+ end
+
+end