git-trac 0.0.20071211 → 0.0.20080127

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.
@@ -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
+