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.
@@ -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
- collection.last.description = str
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.gsub(/[^A-Za-z0-9]+/,"_")}"
73
+ "trac/#{ticket.number}/#{filename}"
70
74
  end
71
75
 
72
76
  def tag_path
@@ -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 download filenames matching PATTERN") do |pattern|
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 = get_ticket_number
155
- @repository.ticket(number).attachments.each do |attach|
156
- next if options[:filter] && attach.filename !~ /#{options[:filter]}/
157
- File.open(attach.filename, "w") do |f|
158
- f.puts attach.patch_with_root(options[:root])
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 matching PATTERN") do |pattern|
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-]update","automatically run git-svn fetch") do |bool|
226
- options[:update] = bool
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
- number = get_ticket_number
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
- @repository.ticket(number).fetch(options) do |attachment, branch|
238
- if branch
239
- puts "#{attachment.filename}: #{branch}"
240
- else
241
- $stderr.puts "#{attachment.filename} FAILED"
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] [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
- begin
275
- @argv.each do |a|
276
- @repository.ticket(Integer(a)).cleanup
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-]update","automatically run git-svn fetch") do |bool|
315
- options[:update] = bool
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
- if options[:update]
346
+ unless options[:local]
322
347
  @repository.in_work_tree do
323
348
  system("git-svn","fetch")
324
349
  end
@@ -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
- revs << object
126
- repository.exec("git-update-ref","-d",ref,object)
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.description || attachment.filename
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.20071211
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
- test_files: []
43
-
43
+ has_rdoc: true
44
+ homepage: http://git-trac.rubyforge.org
45
+ post_install_message:
44
46
  rdoc_options: []
45
47
 
46
- extra_rdoc_files: []
47
-
48
- executables:
49
- - git-trac
50
- extensions: []
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
- dependencies:
55
- - !ruby/object:Gem::Dependency
56
- name: mechanize
57
- version_requirement:
58
- version_requirements: !ruby/object:Gem::Version::Requirement
59
- requirements:
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
+