git-trac 0.0.20071211 → 0.0.20080127
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/git/trac/attachment.rb +6 -2
- data/lib/git/trac/runner.rb +56 -31
- data/lib/git/trac/ticket.rb +8 -5
- metadata +49 -42
data/lib/git/trac/attachment.rb
CHANGED
@@ -12,19 +12,23 @@ module Git
|
|
12
12
|
|
13
13
|
def self.from_hpricot(ticket, html)
|
14
14
|
collection = []
|
15
|
+
last = nil
|
15
16
|
return collection unless html
|
16
17
|
html.children.each do |element|
|
17
18
|
if !element.elem?
|
18
19
|
elsif element.name == "dd"
|
19
20
|
str = ""
|
20
21
|
element.traverse_text {|t| str << t.to_s}
|
21
|
-
|
22
|
+
last.description = str if last
|
22
23
|
elsif element.name = "dt"
|
23
24
|
texts = []
|
24
25
|
element.traverse_text {|x| texts << x.to_s}
|
25
26
|
if texts.first =~ /\A([\w-]*)(\.\d+)?\.(diff|patch)\Z/
|
26
27
|
time = Time.parse("#{texts[3]} +0000").utc
|
27
28
|
collection << new(ticket, texts[0], texts[2], time)
|
29
|
+
last = collection.last
|
30
|
+
else
|
31
|
+
last = nil
|
28
32
|
end
|
29
33
|
end
|
30
34
|
end
|
@@ -66,7 +70,7 @@ module Git
|
|
66
70
|
end
|
67
71
|
|
68
72
|
def tag_name
|
69
|
-
"trac/#{ticket.number}/#{filename
|
73
|
+
"trac/#{ticket.number}/#{filename}"
|
70
74
|
end
|
71
75
|
|
72
76
|
def tag_path
|
data/lib/git/trac/runner.rb
CHANGED
@@ -58,7 +58,7 @@ Available commands:
|
|
58
58
|
end
|
59
59
|
|
60
60
|
klass_name = command.capitalize.gsub(/-(.)/) { $1.upcase }
|
61
|
-
if self.class.const_defined?(klass_name)
|
61
|
+
if klass_name =~ /^[A-Z]\w*$/ && self.class.const_defined?(klass_name)
|
62
62
|
klass = self.class.const_get(klass_name)
|
63
63
|
if klass < Base
|
64
64
|
return klass.new(@argv, @repository)
|
@@ -75,7 +75,7 @@ Available commands:
|
|
75
75
|
|
76
76
|
def initialize(argv, repo)
|
77
77
|
@argv, @repository = argv, repo
|
78
|
-
@options =
|
78
|
+
@options = repo.config("trac")
|
79
79
|
@opts = OptionParser.new
|
80
80
|
@opts.banner = "Usage: git-trac #{command} #{banner_arguments}\n#{"\n" if description}#{description}"
|
81
81
|
@opts.separator("")
|
@@ -103,13 +103,24 @@ Available commands:
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
+
def each_ticket_argument
|
107
|
+
if @argv.empty?
|
108
|
+
yield get_ticket_number, nil
|
109
|
+
elsif @argv.any? {|a| a !~ /\b\d+\b/}
|
110
|
+
abort "ticket number required"
|
111
|
+
end
|
112
|
+
@argv.each do |arg|
|
113
|
+
match_data = arg.match(/\b(\d+)\b(?:\/([^?\/]+))?/)
|
114
|
+
yield Integer(match_data[1]), match_data[2]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
106
118
|
def require_ticket_number
|
107
119
|
@opts.separator("Ticket number is required unless it can be derived from the current branch.\n")
|
108
120
|
end
|
109
121
|
|
110
122
|
def abort(message)
|
111
123
|
$stderr.puts "Error: #{message}"
|
112
|
-
# $stderr.puts @opts
|
113
124
|
exit(1)
|
114
125
|
end
|
115
126
|
|
@@ -136,13 +147,13 @@ directory.
|
|
136
147
|
end
|
137
148
|
|
138
149
|
def banner_arguments
|
139
|
-
"[options] [ticket]"
|
150
|
+
"[options] [ticket[/filename]] ..."
|
140
151
|
end
|
141
152
|
|
142
153
|
def add_options(opts)
|
143
154
|
require_ticket_number
|
144
155
|
opts.separator("Options:")
|
145
|
-
opts.on("--filter PATTERN","only
|
156
|
+
opts.on("--filter PATTERN","only get matching filenames (deprecated)") do |pattern|
|
146
157
|
options[:filter] = pattern
|
147
158
|
end
|
148
159
|
opts.on("--root DIR","prefix patch paths with DIR") do |dir|
|
@@ -151,11 +162,17 @@ directory.
|
|
151
162
|
end
|
152
163
|
|
153
164
|
def run
|
154
|
-
number
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
165
|
+
each_ticket_argument do |number, filename|
|
166
|
+
filter = if filename
|
167
|
+
"\\A#{Regexp.escape(filename)}"
|
168
|
+
else
|
169
|
+
options[:filter]
|
170
|
+
end
|
171
|
+
@repository.ticket(number).attachments.each do |attach|
|
172
|
+
next if filter && attach.filename !~ /#{filter}/
|
173
|
+
File.open(attach.filename, "w") do |f|
|
174
|
+
f.puts attach.patch_with_root(options[:root])
|
175
|
+
end
|
159
176
|
end
|
160
177
|
end
|
161
178
|
end
|
@@ -193,7 +210,7 @@ Show a crude ticket summary.
|
|
193
210
|
class Fetch < Base #:nodoc:
|
194
211
|
|
195
212
|
def banner_arguments
|
196
|
-
"[ticket]"
|
213
|
+
"[options] [ticket[/filename]] ..."
|
197
214
|
end
|
198
215
|
|
199
216
|
def description
|
@@ -216,29 +233,37 @@ potentially remove conflicted branches first.
|
|
216
233
|
opts.on("--branch BRANCH","apply against branch BRANCH") do |b|
|
217
234
|
options[:branch] = b
|
218
235
|
end
|
219
|
-
opts.on("--filter PATTERN","only fetch filenames
|
236
|
+
opts.on("--filter PATTERN","only fetch matching filenames (deprecated)") do |pattern|
|
220
237
|
options[:filter] = pattern
|
221
238
|
end
|
222
239
|
opts.on("--root DIR","apply patches relative to DIR") do |dir|
|
223
240
|
options[:root] = dir
|
224
241
|
end
|
225
|
-
opts.on("--[no-]
|
226
|
-
options[:
|
242
|
+
opts.on("--[no-]local","don't run git-svn fetch") do |bool|
|
243
|
+
options[:local] = bool
|
244
|
+
end
|
245
|
+
opts.on("--[no-]update","run git-svn fetch (deprecated)") do |bool|
|
246
|
+
options[:local] = !bool
|
227
247
|
end
|
228
248
|
end
|
229
249
|
|
230
250
|
def run
|
231
|
-
|
232
|
-
if options[:update]
|
251
|
+
unless options[:local]
|
233
252
|
@repository.in_work_tree do
|
234
253
|
system("git-svn","fetch")
|
235
254
|
end
|
236
255
|
end
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
256
|
+
each_ticket_argument do |number, filename|
|
257
|
+
loop_opts = options.dup
|
258
|
+
if filename
|
259
|
+
loop_opts[:filter] = "\\A#{Regexp.escape(filename)}"
|
260
|
+
end
|
261
|
+
@repository.ticket(number).fetch(loop_opts) do |attachment, branch|
|
262
|
+
if branch
|
263
|
+
puts "#{attachment.filename}: #{branch}"
|
264
|
+
else
|
265
|
+
$stderr.puts "#{attachment.filename} FAILED"
|
266
|
+
end
|
242
267
|
end
|
243
268
|
end
|
244
269
|
end
|
@@ -248,7 +273,7 @@ potentially remove conflicted branches first.
|
|
248
273
|
class Cleanup < Base #:nodoc:
|
249
274
|
|
250
275
|
def banner_arguments
|
251
|
-
"[options] [ticket
|
276
|
+
"[options] [ticket[/filename]] ..."
|
252
277
|
end
|
253
278
|
|
254
279
|
def description
|
@@ -271,12 +296,9 @@ been closed, but you can also specify ticket numbers explicitly or use --all.
|
|
271
296
|
t.cleanup
|
272
297
|
end
|
273
298
|
elsif @argv.any?
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
end
|
278
|
-
rescue TypeError
|
279
|
-
abort "invalid ticket number"
|
299
|
+
each_ticket_argument do |number, filename|
|
300
|
+
filter = "\\A#{Regexp.escape(filename.to_s)}"
|
301
|
+
@repository.ticket(number).cleanup(:filter => filter)
|
280
302
|
end
|
281
303
|
else
|
282
304
|
@repository.working_tickets.each do |t|
|
@@ -311,14 +333,17 @@ it against a production trac server.
|
|
311
333
|
opts.on("--[no-]force", "do not prompt before uploading") do |force|
|
312
334
|
options[:force] = force
|
313
335
|
end
|
314
|
-
opts.on("--[no-]
|
315
|
-
options[:
|
336
|
+
opts.on("--[no-]local","don't run git-svn fetch") do |bool|
|
337
|
+
options[:local] = bool
|
338
|
+
end
|
339
|
+
opts.on("--[no-]update","run git-svn fetch (deprecated)") do |bool|
|
340
|
+
options[:local] = !bool
|
316
341
|
end
|
317
342
|
end
|
318
343
|
|
319
344
|
def run
|
320
345
|
number = get_ticket_number
|
321
|
-
|
346
|
+
unless options[:local]
|
322
347
|
@repository.in_work_tree do
|
323
348
|
system("git-svn","fetch")
|
324
349
|
end
|
data/lib/git/trac/ticket.rb
CHANGED
@@ -119,11 +119,13 @@ module Git
|
|
119
119
|
%w(new reopened).include?(c["status"])
|
120
120
|
end
|
121
121
|
|
122
|
-
def cleanup
|
122
|
+
def cleanup(options = {})
|
123
123
|
revs = []
|
124
124
|
repository.each_ref("refs/remotes/trac/#{number}") do |object, ref|
|
125
|
-
|
126
|
-
|
125
|
+
if File.basename(ref) =~ /#{options[:filter]}/
|
126
|
+
revs << object
|
127
|
+
repository.exec("git-update-ref","-d",ref,object)
|
128
|
+
end
|
127
129
|
end
|
128
130
|
unless revs.empty?
|
129
131
|
repository.each_ref("refs/heads") do |object, ref|
|
@@ -136,7 +138,7 @@ module Git
|
|
136
138
|
end
|
137
139
|
|
138
140
|
def fetch(options = {})
|
139
|
-
cleanup
|
141
|
+
cleanup(options)
|
140
142
|
seen = {}
|
141
143
|
repository.with_index("tracindex#{$$}") do
|
142
144
|
FileUtils.mkdir_p(trac_dir)
|
@@ -163,7 +165,8 @@ module Git
|
|
163
165
|
parents = " -p #{parent}"
|
164
166
|
end
|
165
167
|
commit = repository.popen3("git-commit-tree #{tree}#{parents}") do |i,o,e|
|
166
|
-
i.puts attachment.
|
168
|
+
i.puts "#{number}/#{attachment.filename}"
|
169
|
+
i.puts "\n#{attachment.description}" if attachment.description
|
167
170
|
i.close
|
168
171
|
o.read.chomp
|
169
172
|
end
|
metadata
CHANGED
@@ -1,33 +1,34 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.0
|
3
|
-
specification_version: 1
|
4
2
|
name: git-trac
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-12-11 00:00:00 -06:00
|
8
|
-
summary: Interact with trac from a git repository pulled from svn
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: ruby@tpope.info
|
12
|
-
homepage: http://git-trac.rubyforge.org
|
13
|
-
rubyforge_project: git-trac
|
14
|
-
description: git-trac takes the repetition out of working with trac and git-svn. Among other features is the ability to easily attach a patch to a ticket and to pull all patches from a ticket and turn them into git branches. Created for (but not limited to) work on the Ruby on Rails core.
|
15
|
-
autorequire:
|
16
|
-
default_executable: git-trac
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.0.20080127
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- Tim Pope
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-01-27 00:00:00 -06:00
|
13
|
+
default_executable: git-trac
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: mechanize
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.6.8
|
23
|
+
version:
|
24
|
+
description: git-trac takes the repetition out of working with trac and git-svn. Among other features is the ability to easily attach a patch to a ticket and to pull all patches from a ticket and turn them into git branches. Created for (but not limited to) work on the Ruby on Rails core.
|
25
|
+
email: ruby@tpope.info
|
26
|
+
executables:
|
27
|
+
- git-trac
|
28
|
+
extensions: []
|
29
|
+
|
30
|
+
extra_rdoc_files: []
|
31
|
+
|
31
32
|
files:
|
32
33
|
- Rakefile
|
33
34
|
- README
|
@@ -39,25 +40,31 @@ files:
|
|
39
40
|
- lib/git/trac/runner.rb
|
40
41
|
- lib/git/trac/ticket.rb
|
41
42
|
- test/execution_test.rb
|
42
|
-
|
43
|
-
|
43
|
+
has_rdoc: true
|
44
|
+
homepage: http://git-trac.rubyforge.org
|
45
|
+
post_install_message:
|
44
46
|
rdoc_options: []
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
52
62
|
requirements: []
|
53
63
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: 0.6.8
|
63
|
-
version:
|
64
|
+
rubyforge_project: git-trac
|
65
|
+
rubygems_version: 1.0.1
|
66
|
+
signing_key:
|
67
|
+
specification_version: 2
|
68
|
+
summary: Interact with trac from a git repository pulled from svn
|
69
|
+
test_files: []
|
70
|
+
|