esr-rim 1.4.0 → 1.4.2
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 +5 -13
- data/CHANGELOG +9 -0
- data/Rakefile +56 -56
- data/lib/rim/command/sync.rb +89 -89
- data/lib/rim/command_helper.rb +143 -143
- data/lib/rim/git.rb +2 -1
- data/lib/rim/manifest/helper.rb +82 -82
- data/lib/rim/manifest/json_reader.rb +41 -41
- data/lib/rim/manifest/manifest.json +7 -7
- data/lib/rim/module_helper.rb +57 -57
- data/lib/rim/module_info.rb +43 -43
- data/lib/rim/processor.rb +152 -152
- data/lib/rim/rim.rb +94 -94
- data/lib/rim/sync_helper.rb +150 -150
- data/lib/rim/sync_module_helper.rb +107 -107
- data/lib/rim/upload_helper.rb +69 -69
- data/lib/rim/upload_module_helper.rb +163 -162
- data/lib/rim/version.rb +1 -1
- data/test/command_helper_test.rb +83 -83
- data/test/file_helper_test.rb +132 -132
- data/test/manifest_helper_test.rb +29 -29
- data/test/manifest_test_dir/manifest.rim +9 -9
- data/test/processor_test.rb +32 -32
- data/test/sync_helper_test.rb +296 -296
- data/test/sync_module_helper_test.rb +126 -126
- data/test/upload_helper_test.rb +403 -403
- data/test/upload_module_helper_test.rb +92 -92
- metadata +9 -15
- data/test/dirty_check/dir1/file2 +0 -1
- data/test/dirty_check/file1 +0 -1
- data/test/dirty_check/ign_file1 +0 -1
- data/test/rim_info/mod1/dir1/file2 +0 -1
- data/test/rim_info/mod1/file1 +0 -1
- data/test/rim_info/unrelated_file +0 -1
data/lib/rim/sync_helper.rb
CHANGED
@@ -1,150 +1,150 @@
|
|
1
|
-
require 'rim/command_helper'
|
2
|
-
require 'rim/sync_module_helper'
|
3
|
-
require 'rim/status_builder'
|
4
|
-
require 'tempfile'
|
5
|
-
require 'fileutils'
|
6
|
-
|
7
|
-
module RIM
|
8
|
-
|
9
|
-
class SyncHelper < CommandHelper
|
10
|
-
|
11
|
-
def initialize(workspace_root, logger, module_infos = nil)
|
12
|
-
@module_infos = []
|
13
|
-
super(workspace_root, logger, module_infos)
|
14
|
-
end
|
15
|
-
|
16
|
-
# called to add a module info
|
17
|
-
def add_module_info(module_info)
|
18
|
-
@module_infos.push(module_info)
|
19
|
-
end
|
20
|
-
|
21
|
-
# sync all module changes into rim branch
|
22
|
-
def sync(message = nil, rebase = nil, split = true)
|
23
|
-
# get the name of the current workspace branch
|
24
|
-
RIM::git_session(@ws_root) do |s|
|
25
|
-
branch = s.current_branch || ''
|
26
|
-
rim_branch = "rim/" + branch
|
27
|
-
branch_sha1 = nil
|
28
|
-
changed_modules = nil
|
29
|
-
if branch.empty?
|
30
|
-
raise RimException.new("Not on a git branch.")
|
31
|
-
elsif branch.start_with?("rim/")
|
32
|
-
raise RimException.new("The current git branch '#{branch}' is a rim integration branch. Please switch to a non rim branch to proceed.")
|
33
|
-
else
|
34
|
-
branch = "refs/heads/#{branch}"
|
35
|
-
branch_sha1 = s.rev_sha1(rim_branch)
|
36
|
-
remote_rev = get_latest_remote_revision(s, branch)
|
37
|
-
rev = get_latest_clean_path_revision(s, branch, remote_rev)
|
38
|
-
if !s.has_branch?(rim_branch) || has_ancestor?(s, branch, s.rev_sha1(rim_branch)) || !has_ancestor?(s, rim_branch, remote_rev)
|
39
|
-
s.execute("git branch -f #{rim_branch} #{rev}")
|
40
|
-
branch_sha1 = s.rev_sha1(rim_branch)
|
41
|
-
end
|
42
|
-
remote_url = "file://" + @ws_root
|
43
|
-
@logger.debug("Folder for temporary git repositories: #{@rim_path}")
|
44
|
-
tmpdir = clone_or_fetch_repository(remote_url, module_tmp_git_path(".ws"), "Cloning workspace git...")
|
45
|
-
RIM::git_session(tmpdir) do |tmp_session|
|
46
|
-
tmp_session.execute("git reset --hard")
|
47
|
-
tmp_session.execute("git clean -xdf")
|
48
|
-
# use -f here to prevent git checkout from checking for untracked files which might be overwritten.
|
49
|
-
# this is safe since we removed any untracked files before.
|
50
|
-
# this is a workaround for a name case problem on windows:
|
51
|
-
# if a file's name changes case between the current head and the checkout target,
|
52
|
-
# git checkout will report the file with the new name as untracked and will fail
|
53
|
-
tmp_session.execute("git checkout -B #{rim_branch} -f remotes/origin/#{rim_branch}")
|
54
|
-
changed_modules = sync_modules(tmp_session, message)
|
55
|
-
if !split
|
56
|
-
tmp_session.execute("git reset --soft #{branch_sha1}")
|
57
|
-
commit(tmp_session, message ? message : get_commit_message(changed_modules)) if tmp_session.uncommited_changes?
|
58
|
-
end
|
59
|
-
tmp_session.execute("git push #{remote_url} #{rim_branch}:#{rim_branch}")
|
60
|
-
end
|
61
|
-
end
|
62
|
-
if !changed_modules.empty?
|
63
|
-
if rebase
|
64
|
-
s.execute("git rebase #{rim_branch}")
|
65
|
-
@logger.info("Changes have been commited to branch #{rim_branch} and workspace has been rebased successfully.")
|
66
|
-
else
|
67
|
-
@logger.info("Changes have been commited to branch #{rim_branch}. Rebase to apply changes to workspace.")
|
68
|
-
end
|
69
|
-
else
|
70
|
-
@logger.info("No changes.")
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
private
|
76
|
-
# sync all modules
|
77
|
-
def sync_modules(session, message)
|
78
|
-
module_helpers = []
|
79
|
-
@module_infos.each do |module_info|
|
80
|
-
module_helpers.push(SyncModuleHelper.new(session.execute_dir, @ws_root, module_info, @logger))
|
81
|
-
end
|
82
|
-
changed_modules = []
|
83
|
-
module_helpers.each do |m|
|
84
|
-
@logger.info("Synchronizing #{m.module_info.local_path}...")
|
85
|
-
if m.sync(message)
|
86
|
-
changed_modules << m.module_info
|
87
|
-
end
|
88
|
-
end
|
89
|
-
changed_modules
|
90
|
-
end
|
91
|
-
|
92
|
-
# get latest revision from which all parent revisions are clean
|
93
|
-
def get_latest_clean_path_revision(session, rev, remote_rev)
|
94
|
-
# make sure we deal only with sha1s
|
95
|
-
rev = session.rev_sha1(rev)
|
96
|
-
# get history status (up to last remote revision)
|
97
|
-
status = StatusBuilder.new().rev_history_status(session, rev, :fast => true)
|
98
|
-
clean_rev = rev;
|
99
|
-
while status
|
100
|
-
dirty = status.dirty?
|
101
|
-
status = !status.parents.empty? ? status.parents[0] : nil
|
102
|
-
clean_rev = status ? status.git_rev : remote_rev if dirty
|
103
|
-
end
|
104
|
-
clean_rev
|
105
|
-
end
|
106
|
-
|
107
|
-
# get latest remote revision
|
108
|
-
def get_latest_remote_revision(session, rev)
|
109
|
-
# remote revs are where we stop traversal
|
110
|
-
non_remote_revs = {}
|
111
|
-
session.all_reachable_non_remote_revs(rev).each do |r|
|
112
|
-
non_remote_revs[r] = true
|
113
|
-
end
|
114
|
-
# make sure we deal only with sha1s
|
115
|
-
rev = session.rev_sha1(rev)
|
116
|
-
start_rev = rev;
|
117
|
-
while rev && non_remote_revs[rev]
|
118
|
-
rev = get_parent(session, rev)
|
119
|
-
end
|
120
|
-
rev
|
121
|
-
end
|
122
|
-
|
123
|
-
# check whether revision has a given ancestor
|
124
|
-
def has_ancestor?(session, rev, ancestor)
|
125
|
-
# make sure we deal only with sha1s
|
126
|
-
rev = session.rev_sha1(rev)
|
127
|
-
return rev == ancestor || session.is_ancestor?(ancestor, rev)
|
128
|
-
end
|
129
|
-
|
130
|
-
# get first parent node
|
131
|
-
def get_parent(session, rev)
|
132
|
-
parents = session.parent_revs(rev)
|
133
|
-
!parents.empty? ? parents.first : nil
|
134
|
-
end
|
135
|
-
|
136
|
-
#create default commit message from array of changed modules
|
137
|
-
def get_commit_message(changed_modules)
|
138
|
-
StringIO.open do |s|
|
139
|
-
s.puts "rim sync."
|
140
|
-
s.puts
|
141
|
-
changed_modules.each do |m|
|
142
|
-
s.puts m.local_path
|
143
|
-
end
|
144
|
-
s.string
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
end
|
149
|
-
|
150
|
-
end
|
1
|
+
require 'rim/command_helper'
|
2
|
+
require 'rim/sync_module_helper'
|
3
|
+
require 'rim/status_builder'
|
4
|
+
require 'tempfile'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
module RIM
|
8
|
+
|
9
|
+
class SyncHelper < CommandHelper
|
10
|
+
|
11
|
+
def initialize(workspace_root, logger, module_infos = nil)
|
12
|
+
@module_infos = []
|
13
|
+
super(workspace_root, logger, module_infos)
|
14
|
+
end
|
15
|
+
|
16
|
+
# called to add a module info
|
17
|
+
def add_module_info(module_info)
|
18
|
+
@module_infos.push(module_info)
|
19
|
+
end
|
20
|
+
|
21
|
+
# sync all module changes into rim branch
|
22
|
+
def sync(message = nil, rebase = nil, split = true)
|
23
|
+
# get the name of the current workspace branch
|
24
|
+
RIM::git_session(@ws_root) do |s|
|
25
|
+
branch = s.current_branch || ''
|
26
|
+
rim_branch = "rim/" + branch
|
27
|
+
branch_sha1 = nil
|
28
|
+
changed_modules = nil
|
29
|
+
if branch.empty?
|
30
|
+
raise RimException.new("Not on a git branch.")
|
31
|
+
elsif branch.start_with?("rim/")
|
32
|
+
raise RimException.new("The current git branch '#{branch}' is a rim integration branch. Please switch to a non rim branch to proceed.")
|
33
|
+
else
|
34
|
+
branch = "refs/heads/#{branch}"
|
35
|
+
branch_sha1 = s.rev_sha1(rim_branch)
|
36
|
+
remote_rev = get_latest_remote_revision(s, branch)
|
37
|
+
rev = get_latest_clean_path_revision(s, branch, remote_rev)
|
38
|
+
if !s.has_branch?(rim_branch) || has_ancestor?(s, branch, s.rev_sha1(rim_branch)) || !has_ancestor?(s, rim_branch, remote_rev)
|
39
|
+
s.execute("git branch -f #{rim_branch} #{rev}")
|
40
|
+
branch_sha1 = s.rev_sha1(rim_branch)
|
41
|
+
end
|
42
|
+
remote_url = "file://" + @ws_root
|
43
|
+
@logger.debug("Folder for temporary git repositories: #{@rim_path}")
|
44
|
+
tmpdir = clone_or_fetch_repository(remote_url, module_tmp_git_path(".ws"), "Cloning workspace git...")
|
45
|
+
RIM::git_session(tmpdir) do |tmp_session|
|
46
|
+
tmp_session.execute("git reset --hard")
|
47
|
+
tmp_session.execute("git clean -xdf")
|
48
|
+
# use -f here to prevent git checkout from checking for untracked files which might be overwritten.
|
49
|
+
# this is safe since we removed any untracked files before.
|
50
|
+
# this is a workaround for a name case problem on windows:
|
51
|
+
# if a file's name changes case between the current head and the checkout target,
|
52
|
+
# git checkout will report the file with the new name as untracked and will fail
|
53
|
+
tmp_session.execute("git checkout -B #{rim_branch} -f remotes/origin/#{rim_branch}")
|
54
|
+
changed_modules = sync_modules(tmp_session, message)
|
55
|
+
if !split
|
56
|
+
tmp_session.execute("git reset --soft #{branch_sha1}")
|
57
|
+
commit(tmp_session, message ? message : get_commit_message(changed_modules)) if tmp_session.uncommited_changes?
|
58
|
+
end
|
59
|
+
tmp_session.execute("git push #{remote_url} #{rim_branch}:#{rim_branch}")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
if !changed_modules.empty?
|
63
|
+
if rebase
|
64
|
+
s.execute("git rebase #{rim_branch}")
|
65
|
+
@logger.info("Changes have been commited to branch #{rim_branch} and workspace has been rebased successfully.")
|
66
|
+
else
|
67
|
+
@logger.info("Changes have been commited to branch #{rim_branch}. Rebase to apply changes to workspace.")
|
68
|
+
end
|
69
|
+
else
|
70
|
+
@logger.info("No changes.")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
# sync all modules
|
77
|
+
def sync_modules(session, message)
|
78
|
+
module_helpers = []
|
79
|
+
@module_infos.each do |module_info|
|
80
|
+
module_helpers.push(SyncModuleHelper.new(session.execute_dir, @ws_root, module_info, @logger))
|
81
|
+
end
|
82
|
+
changed_modules = []
|
83
|
+
module_helpers.each do |m|
|
84
|
+
@logger.info("Synchronizing #{m.module_info.local_path}...")
|
85
|
+
if m.sync(message)
|
86
|
+
changed_modules << m.module_info
|
87
|
+
end
|
88
|
+
end
|
89
|
+
changed_modules
|
90
|
+
end
|
91
|
+
|
92
|
+
# get latest revision from which all parent revisions are clean
|
93
|
+
def get_latest_clean_path_revision(session, rev, remote_rev)
|
94
|
+
# make sure we deal only with sha1s
|
95
|
+
rev = session.rev_sha1(rev)
|
96
|
+
# get history status (up to last remote revision)
|
97
|
+
status = StatusBuilder.new().rev_history_status(session, rev, :fast => true)
|
98
|
+
clean_rev = rev;
|
99
|
+
while status
|
100
|
+
dirty = status.dirty?
|
101
|
+
status = !status.parents.empty? ? status.parents[0] : nil
|
102
|
+
clean_rev = status ? status.git_rev : remote_rev if dirty
|
103
|
+
end
|
104
|
+
clean_rev
|
105
|
+
end
|
106
|
+
|
107
|
+
# get latest remote revision
|
108
|
+
def get_latest_remote_revision(session, rev)
|
109
|
+
# remote revs are where we stop traversal
|
110
|
+
non_remote_revs = {}
|
111
|
+
session.all_reachable_non_remote_revs(rev).each do |r|
|
112
|
+
non_remote_revs[r] = true
|
113
|
+
end
|
114
|
+
# make sure we deal only with sha1s
|
115
|
+
rev = session.rev_sha1(rev)
|
116
|
+
start_rev = rev;
|
117
|
+
while rev && non_remote_revs[rev]
|
118
|
+
rev = get_parent(session, rev)
|
119
|
+
end
|
120
|
+
rev
|
121
|
+
end
|
122
|
+
|
123
|
+
# check whether revision has a given ancestor
|
124
|
+
def has_ancestor?(session, rev, ancestor)
|
125
|
+
# make sure we deal only with sha1s
|
126
|
+
rev = session.rev_sha1(rev)
|
127
|
+
return rev == ancestor || session.is_ancestor?(ancestor, rev)
|
128
|
+
end
|
129
|
+
|
130
|
+
# get first parent node
|
131
|
+
def get_parent(session, rev)
|
132
|
+
parents = session.parent_revs(rev)
|
133
|
+
!parents.empty? ? parents.first : nil
|
134
|
+
end
|
135
|
+
|
136
|
+
#create default commit message from array of changed modules
|
137
|
+
def get_commit_message(changed_modules)
|
138
|
+
StringIO.open do |s|
|
139
|
+
s.puts "rim sync."
|
140
|
+
s.puts
|
141
|
+
changed_modules.each do |m|
|
142
|
+
s.puts m.local_path
|
143
|
+
end
|
144
|
+
s.string
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
@@ -1,107 +1,107 @@
|
|
1
|
-
require 'rim/module_helper'
|
2
|
-
require 'rim/rim_info'
|
3
|
-
require 'rim/file_helper'
|
4
|
-
require 'rim/dirty_check'
|
5
|
-
require 'tempfile'
|
6
|
-
require 'pathname'
|
7
|
-
|
8
|
-
module RIM
|
9
|
-
class SyncModuleHelper < ModuleHelper
|
10
|
-
def initialize(dest_root, workspace_root, module_info, logger)
|
11
|
-
super(workspace_root, module_info, logger)
|
12
|
-
@dest_root = dest_root
|
13
|
-
end
|
14
|
-
|
15
|
-
# do the local sync without committing
|
16
|
-
def sync(message = nil)
|
17
|
-
fetch_module
|
18
|
-
export_module(message)
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
# export +revision+ of +mod+ into working copy
|
24
|
-
# BEWARE: any changes to the working copy target dir will be lost!
|
25
|
-
def export_module(message)
|
26
|
-
changes = false
|
27
|
-
RIM::git_session(@dest_root) do |d|
|
28
|
-
start_sha1 = d.rev_sha1("HEAD")
|
29
|
-
git_path = module_git_path(@remote_path)
|
30
|
-
RIM::git_session(git_path) do |s|
|
31
|
-
if !s.rev_sha1(@module_info.target_revision)
|
32
|
-
raise RimException.new("Unknown target revision '#{@module_info.target_revision}' for module '#{@module_info.local_path}'.")
|
33
|
-
end
|
34
|
-
local_path = File.join(@dest_root, @module_info.local_path)
|
35
|
-
prepare_empty_folder(local_path, @module_info.ignores)
|
36
|
-
temp_commit(d, "clear directory") if d.uncommited_changes?
|
37
|
-
strip = ""
|
38
|
-
if @module_info.subdir
|
39
|
-
depth = Pathname(@module_info.subdir).each_filename.count()
|
40
|
-
strip = "--strip-components=#{depth}"
|
41
|
-
end
|
42
|
-
s.execute("git archive --format tar #{@module_info.target_revision} #{@module_info.subdir} | tar #{strip} -
|
43
|
-
sha1 = s.execute("git rev-parse #{@module_info.target_revision}").strip
|
44
|
-
@rim_info = RimInfo.new
|
45
|
-
@rim_info.remote_url = @module_info.remote_url
|
46
|
-
@rim_info.target_revision = @module_info.target_revision
|
47
|
-
@rim_info.revision_sha1 = sha1
|
48
|
-
@rim_info.ignores = @module_info.ignores.join(",")
|
49
|
-
@rim_info.subdir = @module_info.subdir
|
50
|
-
@rim_info.infos = s.rev_infos(@module_info.target_revision, RimInfo.git_infos)
|
51
|
-
@rim_info.to_dir(local_path)
|
52
|
-
DirtyCheck.mark_clean(local_path)
|
53
|
-
end
|
54
|
-
temp_commit(d, "commit changes") if needs_commit?(d)
|
55
|
-
d.execute("git reset --soft #{start_sha1}")
|
56
|
-
changes = d.uncommited_changes?
|
57
|
-
commit(d, message || "rim sync: module #{@module_info.local_path}") if changes
|
58
|
-
end
|
59
|
-
changes
|
60
|
-
end
|
61
|
-
|
62
|
-
def needs_commit?(session)
|
63
|
-
# do we need to commit something?
|
64
|
-
stat = session.status(@module_info.local_path)
|
65
|
-
# no files should be ignored due to --force option. Anyway we will check for ignored files
|
66
|
-
ignored = []
|
67
|
-
session.execute("git add --all --force #{@module_info.local_path}") do |out, e|
|
68
|
-
ignored = parse_ignored_files(session, out, e)
|
69
|
-
end
|
70
|
-
if ignored.empty?
|
71
|
-
stat = session.status(@module_info.local_path)
|
72
|
-
ignored = stat.lines.select{ |l| l.ignored? }
|
73
|
-
end
|
74
|
-
if !ignored.empty?
|
75
|
-
messages = ["Sync failed due to files/dirs of #{@module_info.local_path} which are ignored by workspace's .gitignore:"]
|
76
|
-
ignored.each do |l|
|
77
|
-
messages.push(l.file)
|
78
|
-
end
|
79
|
-
raise RimException.new(messages)
|
80
|
-
end
|
81
|
-
stat.lines.any?
|
82
|
-
end
|
83
|
-
|
84
|
-
def temp_commit(session, message)
|
85
|
-
session.execute("git add --all")
|
86
|
-
session.execute("git commit -m \"#{message}\" --")
|
87
|
-
end
|
88
|
-
|
89
|
-
def parse_ignored_files(session, out, e)
|
90
|
-
first_line = true
|
91
|
-
ignored = []
|
92
|
-
out.gsub(/warning:.*will be replaced.*\r?\n.*\r?\n/, '').split(/\r?\n/).each do |l|
|
93
|
-
raise e || RimException.new("Cannot parse ignored files after git add:\n#{out}") if first_line && !l.include?(".gitignore")
|
94
|
-
if File.exist?(File.expand_path(l, session.execute_dir))
|
95
|
-
ignored_line = GitSession::Status::Line.new
|
96
|
-
ignored_line.file = l
|
97
|
-
ignored_line.istat = "!"
|
98
|
-
ignored.push(ignored_line)
|
99
|
-
end
|
100
|
-
first_line = false
|
101
|
-
end
|
102
|
-
ignored
|
103
|
-
end
|
104
|
-
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
1
|
+
require 'rim/module_helper'
|
2
|
+
require 'rim/rim_info'
|
3
|
+
require 'rim/file_helper'
|
4
|
+
require 'rim/dirty_check'
|
5
|
+
require 'tempfile'
|
6
|
+
require 'pathname'
|
7
|
+
|
8
|
+
module RIM
|
9
|
+
class SyncModuleHelper < ModuleHelper
|
10
|
+
def initialize(dest_root, workspace_root, module_info, logger)
|
11
|
+
super(workspace_root, module_info, logger)
|
12
|
+
@dest_root = dest_root
|
13
|
+
end
|
14
|
+
|
15
|
+
# do the local sync without committing
|
16
|
+
def sync(message = nil)
|
17
|
+
fetch_module
|
18
|
+
export_module(message)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# export +revision+ of +mod+ into working copy
|
24
|
+
# BEWARE: any changes to the working copy target dir will be lost!
|
25
|
+
def export_module(message)
|
26
|
+
changes = false
|
27
|
+
RIM::git_session(@dest_root) do |d|
|
28
|
+
start_sha1 = d.rev_sha1("HEAD")
|
29
|
+
git_path = module_git_path(@remote_path)
|
30
|
+
RIM::git_session(git_path) do |s|
|
31
|
+
if !s.rev_sha1(@module_info.target_revision)
|
32
|
+
raise RimException.new("Unknown target revision '#{@module_info.target_revision}' for module '#{@module_info.local_path}'.")
|
33
|
+
end
|
34
|
+
local_path = File.join(@dest_root, @module_info.local_path)
|
35
|
+
prepare_empty_folder(local_path, @module_info.ignores)
|
36
|
+
temp_commit(d, "clear directory") if d.uncommited_changes?
|
37
|
+
strip = ""
|
38
|
+
if @module_info.subdir
|
39
|
+
depth = Pathname(@module_info.subdir).each_filename.count()
|
40
|
+
strip = "--strip-components=#{depth}"
|
41
|
+
end
|
42
|
+
s.execute("git archive --format tar #{@module_info.target_revision} #{@module_info.subdir} | tar #{strip} -C #{local_path} -xf -")
|
43
|
+
sha1 = s.execute("git rev-parse #{@module_info.target_revision}").strip
|
44
|
+
@rim_info = RimInfo.new
|
45
|
+
@rim_info.remote_url = @module_info.remote_url
|
46
|
+
@rim_info.target_revision = @module_info.target_revision
|
47
|
+
@rim_info.revision_sha1 = sha1
|
48
|
+
@rim_info.ignores = @module_info.ignores.join(",")
|
49
|
+
@rim_info.subdir = @module_info.subdir
|
50
|
+
@rim_info.infos = s.rev_infos(@module_info.target_revision, RimInfo.git_infos)
|
51
|
+
@rim_info.to_dir(local_path)
|
52
|
+
DirtyCheck.mark_clean(local_path)
|
53
|
+
end
|
54
|
+
temp_commit(d, "commit changes") if needs_commit?(d)
|
55
|
+
d.execute("git reset --soft #{start_sha1}")
|
56
|
+
changes = d.uncommited_changes?
|
57
|
+
commit(d, message || "rim sync: module #{@module_info.local_path}") if changes
|
58
|
+
end
|
59
|
+
changes
|
60
|
+
end
|
61
|
+
|
62
|
+
def needs_commit?(session)
|
63
|
+
# do we need to commit something?
|
64
|
+
stat = session.status(@module_info.local_path)
|
65
|
+
# no files should be ignored due to --force option. Anyway we will check for ignored files
|
66
|
+
ignored = []
|
67
|
+
session.execute("git add --all --force #{@module_info.local_path}") do |out, e|
|
68
|
+
ignored = parse_ignored_files(session, out, e)
|
69
|
+
end
|
70
|
+
if ignored.empty?
|
71
|
+
stat = session.status(@module_info.local_path)
|
72
|
+
ignored = stat.lines.select{ |l| l.ignored? }
|
73
|
+
end
|
74
|
+
if !ignored.empty?
|
75
|
+
messages = ["Sync failed due to files/dirs of #{@module_info.local_path} which are ignored by workspace's .gitignore:"]
|
76
|
+
ignored.each do |l|
|
77
|
+
messages.push(l.file)
|
78
|
+
end
|
79
|
+
raise RimException.new(messages)
|
80
|
+
end
|
81
|
+
stat.lines.any?
|
82
|
+
end
|
83
|
+
|
84
|
+
def temp_commit(session, message)
|
85
|
+
session.execute("git add --all")
|
86
|
+
session.execute("git commit -m \"#{message}\" --")
|
87
|
+
end
|
88
|
+
|
89
|
+
def parse_ignored_files(session, out, e)
|
90
|
+
first_line = true
|
91
|
+
ignored = []
|
92
|
+
out.gsub(/warning:.*will be replaced.*\r?\n.*\r?\n/, '').split(/\r?\n/).each do |l|
|
93
|
+
raise e || RimException.new("Cannot parse ignored files after git add:\n#{out}") if first_line && !l.include?(".gitignore")
|
94
|
+
if File.exist?(File.expand_path(l, session.execute_dir))
|
95
|
+
ignored_line = GitSession::Status::Line.new
|
96
|
+
ignored_line.file = l
|
97
|
+
ignored_line.istat = "!"
|
98
|
+
ignored.push(ignored_line)
|
99
|
+
end
|
100
|
+
first_line = false
|
101
|
+
end
|
102
|
+
ignored
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|