esr-rim 1.3.9 → 1.4.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/CHANGELOG +33 -0
- data/Rakefile +56 -56
- data/lib/rim/command/sync.rb +89 -89
- data/lib/rim/command_helper.rb +144 -143
- data/lib/rim/dirty_check.rb +9 -2
- data/lib/rim/file_helper.rb +0 -2
- data/lib/rim/git.rb +20 -1
- data/lib/rim/info_helper.rb +5 -1
- data/lib/rim/info_module_helper.rb +5 -0
- 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/rim_info.rb +26 -2
- data/lib/rim/sync_helper.rb +150 -150
- data/lib/rim/sync_module_helper.rb +107 -106
- data/lib/rim/upload_helper.rb +69 -69
- data/lib/rim/upload_module_helper.rb +163 -162
- data/lib/rim/version.rb +1 -2
- 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 +10 -11
data/lib/rim/rim_info.rb
CHANGED
@@ -36,6 +36,12 @@ class RimInfo
|
|
36
36
|
attr_accessor d
|
37
37
|
end
|
38
38
|
|
39
|
+
@@git_infos = {
|
40
|
+
:committer_date => "%ci"
|
41
|
+
}
|
42
|
+
|
43
|
+
attr_accessor :infos
|
44
|
+
|
39
45
|
def self.exists?(dir)
|
40
46
|
File.exist?(info_file(dir))
|
41
47
|
end
|
@@ -52,6 +58,10 @@ class RimInfo
|
|
52
58
|
mi
|
53
59
|
end
|
54
60
|
|
61
|
+
def self.git_infos
|
62
|
+
@@git_infos
|
63
|
+
end
|
64
|
+
|
55
65
|
def dirty?
|
56
66
|
@dirty
|
57
67
|
end
|
@@ -81,6 +91,12 @@ class RimInfo
|
|
81
91
|
AttrsDef.each do |a|
|
82
92
|
send("#{a}=".to_sym, attrs[a])
|
83
93
|
end
|
94
|
+
@@git_infos.each_pair do |key, value|
|
95
|
+
if attrs.has_key?(key)
|
96
|
+
@infos ||= {}
|
97
|
+
@infos[key] = attrs[key]
|
98
|
+
end
|
99
|
+
end
|
84
100
|
@dirty = checksum != calc_sha1(content)
|
85
101
|
end
|
86
102
|
|
@@ -110,10 +126,18 @@ class RimInfo
|
|
110
126
|
end
|
111
127
|
|
112
128
|
def to_s
|
113
|
-
|
114
|
-
AttrsDef.collect
|
129
|
+
i = @infos || {}
|
130
|
+
max_len = (AttrsDef + i.keys).collect{|a| a.size}.max
|
131
|
+
s = AttrsDef.collect { |a|
|
115
132
|
"#{a.to_s.ljust(max_len)}: #{send(a)}"
|
116
133
|
}.join("\n")
|
134
|
+
if !i.empty?
|
135
|
+
s << "\n\n"
|
136
|
+
i.each_pair { |key, value|
|
137
|
+
s << "#{key.to_s.ljust(max_len)}: #{value.to_s}\n"
|
138
|
+
}
|
139
|
+
end
|
140
|
+
s
|
117
141
|
end
|
118
142
|
|
119
143
|
private
|
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,106 +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,
|
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.
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
d
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
ignored
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
session.execute("git
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
if
|
94
|
-
|
95
|
-
ignored_line
|
96
|
-
ignored_line.
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
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, ".git/**/*"])
|
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
|