scm 0.1.0.pre1 → 0.1.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,7 @@
1
1
  ### 0.1.0 / 2011-06-16
2
2
 
3
3
  * Initial release:
4
+ * Supports {SCM::Git}.
5
+ * Supports {SCM::Hg}.
6
+ * Supports {SCM::SVN}.
4
7
 
@@ -1,3 +1,5 @@
1
+ require 'time'
2
+
1
3
  module SCM
2
4
  module Commits
3
5
  #
@@ -17,6 +19,12 @@ module SCM
17
19
  # The summary of the commit
18
20
  attr_reader :summary
19
21
 
22
+ # The full commit message of the commit
23
+ attr_reader :message
24
+
25
+ # The files changed by the commit
26
+ attr_reader :files
27
+
20
28
  #
21
29
  # Creates a new commit object.
22
30
  #
@@ -32,11 +40,29 @@ module SCM
32
40
  # @param [String] summary
33
41
  # The summary of the commit.
34
42
  #
35
- def initialize(commit,date,author,summary)
36
- @commit = commit
37
- @date = date
38
- @author = author
43
+ # @param [String] message
44
+ # The full commit message of the commit.
45
+ #
46
+ # @param [String] files
47
+ # The files changed in the commit.
48
+ #
49
+ def initialize(commit,date,author,summary,message,files=[])
50
+ @commit = commit
51
+ @date = date
52
+ @author = author
39
53
  @summary = summary
54
+ @message = message
55
+ @files = files
56
+ end
57
+
58
+ #
59
+ # Inspects the commit.
60
+ #
61
+ # @return [String]
62
+ # The inspected commit.
63
+ #
64
+ def inspect
65
+ "#<#{self.class}: #{@commit}>"
40
66
  end
41
67
 
42
68
  #
@@ -37,12 +37,12 @@ module SCM
37
37
  # @param [String] summary
38
38
  # The summary of the commit.
39
39
  #
40
- def initialize(commit,parent,tree,date,author,email,summary)
41
- super(commit,date,author,summary)
40
+ def initialize(commit,parent,tree,date,author,email,summary,message,files)
41
+ super(commit,date,author,summary,message,files)
42
42
 
43
43
  @parent = parent
44
- @tree = tree
45
- @email = email
44
+ @tree = tree
45
+ @email = email
46
46
  end
47
47
 
48
48
  alias sha1 commit
@@ -50,11 +50,11 @@ module SCM
50
50
  #
51
51
  # Coerces the Git commit into an Array.
52
52
  #
53
- # @return [Array<commit, parent, tree, date, author, email, summary>]
53
+ # @return [Array<commit, parent, tree, date, author, email, summary, message, files>]
54
54
  # The commit components.
55
55
  #
56
56
  def to_ary
57
- [@commit, @parent, @tree, @date, @author, @email, @summary]
57
+ [@commit, @parent, @tree, @date, @author, @email, @summary, @message, @files]
58
58
  end
59
59
 
60
60
  end
@@ -34,10 +34,10 @@ module SCM
34
34
  # @param [String] summary
35
35
  # The summary of the commit.
36
36
  #
37
- def initialize(revision,hash,branch,user,date,summary)
38
- super(revision,date,user,summary)
37
+ def initialize(revision,hash,branch,user,date,summary,message,files)
38
+ super(revision,date,user,summary,message,files)
39
39
 
40
- @hash = hash
40
+ @hash = hash
41
41
  @branch = branch
42
42
  end
43
43
 
@@ -249,11 +249,19 @@ module SCM
249
249
  # @param [String, Symbol] name
250
250
  # The name of the branch to switch to.
251
251
  #
252
+ # @param [Hash] options
253
+ # Additional options.
254
+ #
255
+ # @option options [Boolean] :quiet
256
+ # Switch branch quietly.
257
+ #
252
258
  # @return [Boolean]
253
259
  # Specifies whether the branch was successfully switched.
254
260
  #
255
- def switch_branch(name)
256
- git(:checkout,name)
261
+ def switch_branch(name, options={})
262
+ arguments = ""
263
+ arguments << '-q' if options[:quiet]
264
+ git(:checkout, arguments, name)
257
265
  end
258
266
 
259
267
  #
@@ -441,7 +449,10 @@ module SCM
441
449
  def commits(options={})
442
450
  return enum_for(:commits,options) unless block_given?
443
451
 
444
- arguments = ["--pretty=format:%H|%P|%T|%at|%an|%ae|%s"]
452
+ arguments = [
453
+ '--name-only',
454
+ '--pretty=format:%H~|~%P~|~%T~|~%at~|~%an~|~%ae~|~%s~|~%b~|~'
455
+ ]
445
456
 
446
457
  if options[:limit]
447
458
  arguments << "-#{options[:limit]}"
@@ -455,16 +466,23 @@ module SCM
455
466
  arguments += ['--', *options[:paths]]
456
467
  end
457
468
 
458
- commit = nil
459
- parent = nil
460
- tree = nil
461
- tree = nil
462
- parent = nil
463
- author = nil
464
- date = nil
469
+ commit = nil
470
+ parent = nil
471
+ tree = nil
472
+ date = nil
473
+ author = nil
474
+ email = nil
475
+ summary = nil
476
+
477
+ io = popen('git log',*arguments)
465
478
 
466
- popen('git log',*arguments) do |line|
467
- commit, parent, tree, date, author, email, summary = line.split('|',7)
479
+ until io.eof?
480
+ line = io.readline.chomp
481
+
482
+ commit, parent, tree, date, author, email, summary, body, files = line.split('~|~',9)
483
+
484
+ message = [summary, '', body].join($/)
485
+ files = readlines_until(io)
468
486
 
469
487
  yield Commits::Git.new(
470
488
  commit,
@@ -473,11 +491,41 @@ module SCM
473
491
  Time.at(date.to_i),
474
492
  author,
475
493
  email,
476
- summary
494
+ summary,
495
+ message,
496
+ files
477
497
  )
478
498
  end
479
499
  end
480
500
 
501
+ #
502
+ # Lists the files of the Git repository.
503
+ #
504
+ # @param [String] pattern
505
+ # Optional glob pattern to filter the files by.
506
+ #
507
+ # @yield [file]
508
+ # The given block will be passed each file.
509
+ #
510
+ # @yieldparam [String] file
511
+ # A path of a file tracked by Git.
512
+ #
513
+ # @return [Enumerator]
514
+ # If no block is given, an Enumerator will be returned.
515
+ #
516
+ def files(pattern=nil,&block)
517
+ return enum_for(:files,pattern) unless block
518
+
519
+ arguments = []
520
+
521
+ if pattern
522
+ arguments << '--' << pattern
523
+ end
524
+
525
+ popen('git','ls-files',*arguments,&block)
526
+ return nil
527
+ end
528
+
481
529
  protected
482
530
 
483
531
  #
@@ -35,6 +35,10 @@ module SCM
35
35
  # Could not initialize the Hg repository.
36
36
  #
37
37
  def self.create(path,options={})
38
+ if options[:bare]
39
+ raise("Hg does not support creating bare repositories")
40
+ end
41
+
38
42
  unless path.start_with?('ssh://')
39
43
  FileUtils.mkdir_p(path)
40
44
  end
@@ -398,7 +402,7 @@ module SCM
398
402
  def commits(options={})
399
403
  return enum_for(:commits,options) unless block_given?
400
404
 
401
- arguments = []
405
+ arguments = ['-v']
402
406
 
403
407
  if options[:commit]
404
408
  arguments << '--rev' << options[:commit]
@@ -422,12 +426,18 @@ module SCM
422
426
  user = nil
423
427
  date = nil
424
428
  summary = nil
429
+ message = nil
430
+ files = nil
431
+
432
+ io = popen('hg log',*arguments)
433
+
434
+ until io.eof?
435
+ line = io.readline.chomp
425
436
 
426
- popen('hg log',*arguments) do |line|
427
437
  if line.empty?
428
- yield Commits::Hg.new(revision,hash,branch,user,date,summary)
438
+ yield Commits::Hg.new(revision,hash,branch,user,date,summary,message,files)
429
439
 
430
- revision = hash = branch = user = date = summary = nil
440
+ revision = hash = branch = user = date = summary = message = files = nil
431
441
  else
432
442
  key, value = line.split(' ',2)
433
443
 
@@ -440,13 +450,36 @@ module SCM
440
450
  user = value
441
451
  when 'date:'
442
452
  date = Time.parse(value)
443
- when 'summary:'
444
- summary = value
453
+ when 'description:'
454
+ description = readlines_until(io)
455
+ summary = description[0]
456
+ message = description.join($/)
457
+ when 'files:'
458
+ files = value.split(' ')
445
459
  end
446
460
  end
447
461
  end
448
462
  end
449
463
 
464
+ #
465
+ # Lists the files of the Hg repository.
466
+ #
467
+ # @yield [file]
468
+ # The given block will be passed each file.
469
+ #
470
+ # @yieldparam [String] file
471
+ # A path of a file tracked by Hg.
472
+ #
473
+ # @return [Enumerator]
474
+ # If no block is given, an Enumerator will be returned.
475
+ #
476
+ def files(&block)
477
+ return enum_for(:files) unless block
478
+
479
+ popen('hg','manifest',&block)
480
+ return nil
481
+ end
482
+
450
483
  protected
451
484
 
452
485
  #
@@ -311,6 +311,33 @@ module SCM
311
311
  @path.to_s
312
312
  end
313
313
 
314
+ #
315
+ # Inspects the Repository.
316
+ #
317
+ # @return [String]
318
+ # The repository class name and path.
319
+ #
320
+ def inspect
321
+ "#<#{self.class}: #{@path}>"
322
+ end
323
+
324
+ #
325
+ # Lists the files of the repository.
326
+ #
327
+ # @yield [file]
328
+ # The given block will be passed each file.
329
+ #
330
+ # @yieldparam [String] file
331
+ # A path of a file within the repository.
332
+ #
333
+ # @return [Enumerator]
334
+ # If no block is given, an Enumerator will be returned.
335
+ #
336
+ # @abstract
337
+ #
338
+ def files(&block)
339
+ end
340
+
314
341
  protected
315
342
 
316
343
  #
@@ -426,7 +426,7 @@ module SCM
426
426
  def commits(options={})
427
427
  return enum_for(:commits,options) unless block_given?
428
428
 
429
- arguments = []
429
+ arguments = ['-v']
430
430
 
431
431
  if options[:commit]
432
432
  arguments << '--revision' << options[:commit]
@@ -443,7 +443,8 @@ module SCM
443
443
  revision = nil
444
444
  date = nil
445
445
  author = nil
446
- summary = ''
446
+ message = ''
447
+ files = []
447
448
 
448
449
  io = popen('svn log',*arguments)
449
450
 
@@ -451,28 +452,50 @@ module SCM
451
452
  io.readline
452
453
 
453
454
  until io.eof?
454
- line = io.readline
455
- line.chomp!
455
+ line = io.readline.chomp
456
456
 
457
457
  revision, author, date, changes = line.split(' | ',4)
458
458
  revision = revision[1..-1].to_i
459
- date = Time.parse(date)
460
-
461
- # eat the empty line separating the metadata from the summary
462
- line.readline
459
+ date = Time.parse(date)
463
460
 
464
- loop do
465
- line = io.readline
466
- break if line == LOG_SEPARATOR
461
+ # eat the next line separating the metadata from the summary
462
+ line = io.readline.chomp
467
463
 
468
- summary << line
464
+ if line == 'Changed paths:'
465
+ files = readlines_until(io)
469
466
  end
470
467
 
471
- yield Commits::SVN.new(revision,date,author,summary)
468
+ description = readlines_until(io,LOG_SEPARATOR)
469
+ summary = description[0]
470
+ message = description.join($/)
471
+
472
+ yield Commits::SVN.new(revision,date,author,summary,message,files)
472
473
 
473
474
  revision = date = author = nil
474
- summary = ''
475
+ message = ''
476
+ files = []
477
+ end
478
+ end
479
+
480
+ #
481
+ # Lists the files of the SVN repository.
482
+ #
483
+ # @yield [file]
484
+ # The given block will be passed each file.
485
+ #
486
+ # @yieldparam [String] file
487
+ # A path of a file tracked by SVN.
488
+ #
489
+ # @return [Enumerator]
490
+ # If no block is given, an Enumerator will be returned.
491
+ #
492
+ def files
493
+ return enum_for(:files) unless block_given?
494
+
495
+ popen('svn','ls','-R') do |file|
496
+ yield file if File.file?(File.join(@path,file))
475
497
  end
498
+ return nil
476
499
  end
477
500
 
478
501
  protected
@@ -20,6 +20,9 @@ module SCM
20
20
  def run(program,*arguments)
21
21
  arguments = arguments.map { |arg| arg.to_s }
22
22
 
23
+ # filter out empty Strings
24
+ arguments.reject! { |arg| arg.empty? }
25
+
23
26
  system(program.to_s,*arguments)
24
27
  end
25
28
 
@@ -61,5 +64,32 @@ module SCM
61
64
 
62
65
  return io
63
66
  end
67
+
68
+ #
69
+ # Read lines until a separator line is encountered.
70
+ #
71
+ # @param [IO] io
72
+ # The IO stream to read from.
73
+ #
74
+ # @param [String] separator
75
+ # The separator line to stop at.
76
+ #
77
+ # @return [Array<String>]
78
+ # The read lines.
79
+ #
80
+ def readlines_until(io,separator='')
81
+ lines = []
82
+
83
+ until io.eof?
84
+ line = io.readline
85
+ line.chomp!
86
+
87
+ break if line == separator
88
+
89
+ lines << line
90
+ end
91
+
92
+ return lines
93
+ end
64
94
  end
65
95
  end
@@ -1,4 +1,4 @@
1
1
  module SCM
2
2
  # SCM version
3
- VERSION = "0.1.0.pre1"
3
+ VERSION = "0.1.0.pre2"
4
4
  end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+ require 'scm/hg'
3
+
4
+ describe Hg do
5
+ describe "create" do
6
+ it "should create the directory, if it does not exist" do
7
+ repo = Hg.create(directory('create_new_hg_repo'))
8
+
9
+ repo.path.should be_directory
10
+ end
11
+
12
+ it "should create a hg repository" do
13
+ repo = Hg.create(mkdir('init_hg_repo'))
14
+
15
+ repo.path.join('.hg').should be_directory
16
+ end
17
+
18
+ it "should raise an exception when :base is specified" do
19
+ lambda {
20
+ Hg.create(mkdir('init_bare_hg_repo'), :bare => true)
21
+ }.should raise_error
22
+ end
23
+ end
24
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: scm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre1
4
+ version: 0.1.0.pre2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-08-18 00:00:00.000000000Z
12
+ date: 2011-12-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ore-tasks
16
- requirement: &18110220 !ruby/object:Gem::Requirement
16
+ requirement: &12756120 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.4'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *18110220
24
+ version_requirements: *12756120
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &18109620 !ruby/object:Gem::Requirement
27
+ requirement: &12755360 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '2.4'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *18109620
35
+ version_requirements: *12755360
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: yard
38
- requirement: &18109100 !ruby/object:Gem::Requirement
38
+ requirement: &12754740 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: 0.7.0
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *18109100
46
+ version_requirements: *12754740
47
47
  description: SCM is a simple Ruby library for interacting with common SCMs, such as
48
48
  Git, Mercurial (Hg) and SubVersion (SVN).
49
49
  email: postmodern.mod3@gmail.com
@@ -75,6 +75,7 @@ files:
75
75
  - scm.gemspec
76
76
  - spec/git_spec.rb
77
77
  - spec/helpers/scm.rb
78
+ - spec/hg_spec.rb
78
79
  - spec/scm_spec.rb
79
80
  - spec/spec_helper.rb
80
81
  homepage: http://github.com/postmodern/scm
@@ -98,10 +99,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
99
  version: '0'
99
100
  requirements: []
100
101
  rubyforge_project:
101
- rubygems_version: 1.8.8
102
+ rubygems_version: 1.8.10
102
103
  signing_key:
103
104
  specification_version: 3
104
105
  summary: Ruby interface to common SCMs
105
106
  test_files:
106
107
  - spec/git_spec.rb
108
+ - spec/hg_spec.rb
107
109
  - spec/scm_spec.rb
110
+ has_rdoc: