svn_wc 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (5) hide show
  1. data/ChangeLog +3 -0
  2. data/README.rdoc +3 -3
  3. data/lib/svn_wc.rb +68 -106
  4. data/test/svn_wc_test.rb +19 -5
  5. metadata +9 -4
data/ChangeLog CHANGED
@@ -1,3 +1,6 @@
1
+ version 0.0.5
2
+ * code refactoring
3
+
1
4
  version 0.0.4
2
5
  * added :svn_repo_config_file accessor (rw)
3
6
 
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@ Operate on the working copy of a (remote) Subversion (svn) repository.
5
5
 
6
6
  == VERSION:
7
7
 
8
- Version 0.0.4
8
+ Version 0.0.5
9
9
 
10
10
 
11
11
  == SYNOPSIS:
@@ -262,10 +262,10 @@ See the ChangeLog file for details.
262
262
 
263
263
  == LICENSE AND COPYRIGHT:
264
264
 
265
- Copyright 2009 David Wright (david_v_wright@yahoo.com), all rights reserved.
265
+ Copyright 2010 David Wright (david_v_wright@yahoo.com), all rights reserved.
266
266
 
267
267
 
268
- SvnWc::RepoAccess 0.0.4 is released under the LGPL license.
268
+ SvnWc::RepoAccess 0.0.5 is released under the LGPL license.
269
269
 
270
270
 
271
271
  == AUTHOR:
data/lib/svn_wc.rb CHANGED
@@ -154,7 +154,9 @@ module SvnWc
154
154
  # introduce Delegation, if we don't define the method pass it on to the
155
155
  # ruby bindings.
156
156
  #
157
+ #--
157
158
  # (yup, this is probably asking for trouble)
159
+ #++
158
160
  #
159
161
  def method_missing(sym, *args, &block)
160
162
  @ctx.send sym, *args, &block
@@ -163,9 +165,10 @@ module SvnWc
163
165
  #--
164
166
  # TODO revist these
165
167
  #++
166
- attr_accessor :svn_user, :svn_pass, :svn_repo_master, \
168
+ attr_accessor :svn_user, :svn_pass, :svn_repo_master,
167
169
  :svn_repo_working_copy, :cur_file,
168
- :svn_repo_config_path, :svn_repo_config_file
170
+ :svn_repo_config_path, :svn_repo_config_file,
171
+ :force_checkout
169
172
  attr_reader :ctx, :repos
170
173
 
171
174
  #
@@ -176,6 +179,7 @@ module SvnWc
176
179
  conf = load_conf(conf)
177
180
  @svn_user = conf['svn_user']
178
181
  @svn_pass = conf['svn_pass']
182
+ @force_checkout = conf['force_checkout']
179
183
  @svn_repo_master = conf['svn_repo_master']
180
184
  @svn_repo_working_copy = conf['svn_repo_working_copy']
181
185
  @svn_repo_config_path = conf['svn_repo_config_path']
@@ -192,11 +196,12 @@ module SvnWc
192
196
  end
193
197
  ## do checkout if not exists at specified local path
194
198
 
195
- if force
199
+ if force or @force_checkout
196
200
  begin
197
- #FileUtils.rm_rf @svn_repo_working_copy
198
- FileUtils.mkdir_p @svn_repo_working_copy, :force => true
199
- rescue
201
+ FileUtils.rm_rf @svn_repo_working_copy
202
+ FileUtils.mkdir_p @svn_repo_working_copy
203
+ rescue Errno::EACCES => err
204
+ raise RepoAccessError, err.message
200
205
  end
201
206
  else
202
207
  if File.directory? @svn_repo_working_copy
@@ -489,8 +494,10 @@ module SvnWc
489
494
 
490
495
  def do_status(dir=self.svn_repo_working_copy, file=nil) # :nodoc:
491
496
 
497
+ # set default
492
498
  wc_path = Svn::Core.path_canonicalize dir if File.directory? dir
493
499
 
500
+ # override default if set
494
501
  wc_path = Svn::Core.path_canonicalize file \
495
502
  if (!file.nil? && File.file?(file))
496
503
 
@@ -570,7 +577,7 @@ module SvnWc
570
577
  svn.list(wc_path, rev, verbose, depth) do |path, dirent, lock, abs_path|
571
578
  #paths.push(path.empty? ? abs_path : File.join(abs_path, path))
572
579
  f_rec = Hash.new
573
- f_rec[:entry] = (path.empty? ? abs_path : File.join(abs_path, path))
580
+ f_rec[:entry] = path
574
581
  f_rec[:last_changed_rev] = dirent.created_rev
575
582
  paths.push f_rec
576
583
  end
@@ -614,19 +621,16 @@ module SvnWc
614
621
  #
615
622
 
616
623
  def list_entries(dir=self.svn_repo_working_copy, file=nil, verbose=false)
624
+
617
625
  @entry_list, @show, @verbose = [], true, verbose
626
+
618
627
  Svn::Wc::AdmAccess.open(nil, dir, false, 5) do |adm|
619
628
  @adm = adm
620
629
  if file.nil?
621
630
  #also see walk_entries (in svn bindings) has callback
622
631
  adm.read_entries.keys.sort.each { |ef|
623
632
  next unless ef.length >= 1 # why this check and not file.exists?
624
- f_path = File.join(dir, ef)
625
- if File.file? f_path
626
- _collect_get_entry_info(f_path)
627
- elsif File.directory? f_path
628
- _walk_entries(f_path)
629
- end
633
+ _collect_get_entry_info(File.join(dir, ef))
630
634
  }
631
635
  else
632
636
  _collect_get_entry_info(file)
@@ -637,22 +641,6 @@ module SvnWc
637
641
  @entry_list
638
642
  end
639
643
 
640
- #
641
- # private
642
- #
643
- # given a dir, iterate each entry, getting detailed file entry info
644
- #
645
-
646
- def _walk_entries(f_path) #:nodoc:
647
- Dir.entries(f_path).each do |de|
648
- next if de == '..' or de == '.' or de == '.svn'
649
- fp_path = File.join(f_path, de)
650
- _collect_get_entry_info(fp_path)
651
- end
652
- end
653
- private :_walk_entries
654
-
655
-
656
644
  #
657
645
  # private
658
646
  #
@@ -663,9 +651,16 @@ module SvnWc
663
651
  #
664
652
 
665
653
  def _collect_get_entry_info(abs_path_file) #:nodoc:
666
- @status_info = Hash.new
667
- _get_entry_info(abs_path_file)
668
- @entry_list.push @status_info unless @status_info.empty?
654
+ if File.directory?(abs_path_file)
655
+ Dir.entries(abs_path_file).each do |de|
656
+ next if de == '..' or de == '.' or de == '.svn'
657
+ status_info = _get_entry_info(File.join(abs_path_file, de))
658
+ @entry_list.push status_info if status_info and not status_info.empty?
659
+ end
660
+ else
661
+ status_info = _get_entry_info(abs_path_file)
662
+ @entry_list.push status_info if status_info and not status_info.empty?
663
+ end
669
664
  end
670
665
  private :_collect_get_entry_info
671
666
 
@@ -692,55 +687,34 @@ module SvnWc
692
687
  status = @adm.status(abs_path_file)
693
688
  return if status.entry.nil?
694
689
 
695
- @status_info[:entry_name] = entry_repo_location
696
- @status_info[:status] = status_codes(status.text_status)
697
- @status_info[:repo_rev] = status.entry.revision
698
- @status_info[:kind] = status.entry.kind
690
+ status_info = Hash.new
691
+ status_info[:entry_name] = entry_repo_location
692
+ status_info[:status] = status_codes(status.text_status)
693
+ status_info[:repo_rev] = status.entry.revision
694
+ status_info[:kind] = status.entry.kind
699
695
 
700
- if @status_info[:kind] == 2
696
+ if status_info[:kind] == 2
701
697
  # remove the repo root abs path, give dirs relative to repo root
702
- @status_info[:dir_name] = entry_repo_location
703
- # XXX hmmm, this is a little like a goto, revisit this
704
- _walk_entries(abs_path_file)
698
+ status_info[:dir_name] = entry_repo_location
699
+ _collect_get_entry_info(abs_path_file)
705
700
  end
706
- return if @verbose == false
701
+ return status_info if @verbose == false
707
702
  # only on demand ; i.e. verbose = true
708
- s = status.entry
709
- @status_info[:entry_conflict] = entry.conflicted?(abs_path_file)
710
- @status_info[:lock_creation_date] = s.lock_creation_date
711
- @status_info[:present_props] = s.present_props
712
- @status_info[:has_prop_mods] = s.has_prop_mods
713
- @status_info[:copyfrom_url] = s.copyfrom_url
714
- @status_info[:conflict_old] = s.conflict_old
715
- @status_info[:conflict_new] = s.conflict_new
716
- @status_info[:lock_comment] = s.lock_comment
717
- @status_info[:copyfrom_rev] = s.copyfrom_rev
718
- #@status_info[:working_size] = s.working_size
719
- @status_info[:conflict_wrk] = s.conflict_wrk
720
- @status_info[:cmt_author] = s.cmt_author
721
- #@status_info[:changelist] = s.changelist
722
- @status_info[:lock_token] = s.lock_token
723
- #@status_info[:keep_local] = s.keep_local
724
- @status_info[:lock_owner] = s.lock_owner
725
- @status_info[:prop_time] = s.prop_time
726
- @status_info[:has_props] = s.has_props
727
- @status_info[:schedule] = s.schedule
728
- @status_info[:text_time] = s.text_time
729
- @status_info[:revision] = s.revision
730
- @status_info[:checksum] = s.checksum
731
- @status_info[:cmt_date] = s.cmt_date
732
- @status_info[:prejfile] = s.prejfile
733
- @status_info[:is_file] = s.file?
734
- @status_info[:normal?] = s.normal?
735
- @status_info[:cmt_rev] = s.cmt_rev
736
- @status_info[:deleted] = s.deleted
737
- @status_info[:absent] = s.absent
738
- @status_info[:is_add] = s.add?
739
- @status_info[:is_dir] = s.dir?
740
- @status_info[:repos] = s.repos
741
- #@status_info[:depth] = s.depth
742
- @status_info[:uuid] = s.uuid
743
- @status_info[:url] = s.url
703
+ status_info[:entry_conflict] = entry.conflicted?(abs_path_file)
704
+ s_entry_info = %w(
705
+ lock_creation_date present_props has_prop_mods
706
+ copyfrom_url conflict_old conflict_new
707
+ lock_comment copyfrom_rev conflict_wrk
708
+ cmt_author lock_token lock_owner
709
+ prop_time has_props schedule text_time revision
710
+ checksum cmt_date prejfile normal? file? add? dir?
711
+ cmt_rev deleted absent repos uuid url
712
+ ) # working_size changelist keep_local depth
713
+
714
+ s_entry_info.each do |each_info|
715
+ status_info[:"#{each_info}"] = status.entry.method(:"#{each_info}").call
716
+ end
717
+ status_info
744
718
  end
745
719
  private :_get_entry_info
746
720
 
@@ -750,38 +724,26 @@ module SvnWc
750
724
  # TODO - document all the params available from this command
751
725
  #++
752
726
  #
753
- def info(file='')
754
- if file and not (file.empty? or file.nil? or file.class != String)
755
- wc_path = file
756
- else
757
- wc_path = self.svn_repo_working_copy
758
- end
727
+ def info(file=nil)
728
+ wc_path = self.svn_repo_working_copy
729
+ wc_path = file if file and file.class == String
759
730
 
760
731
  r_info = Hash.new
732
+ type_info = %w(
733
+ last_changed_author last_changed_rev
734
+ last_changed_date conflict_old
735
+ repos_root_url repos_root_URL
736
+ copyfrom_rev copyfrom_url conflict_wrk
737
+ conflict_new has_wc_info repos_UUID
738
+ checksum prop_time text_time prejfile
739
+ schedule taguri lock rev dup url URL
740
+ ) # changelist depth size tree_conflict working_size
741
+
761
742
  begin
762
743
  @ctx.info(wc_path) do |path, type|
763
- r_info[:last_changed_author] = type.last_changed_author
764
- r_info[:last_changed_rev] = type.last_changed_rev
765
- r_info[:last_changed_date] = type.last_changed_date
766
- r_info[:conflict_old] = type.conflict_old
767
- #r_info[:tree_conflict] = type.tree_conflict
768
- r_info[:repos_root_url] = type.repos_root_url
769
- r_info[:repos_root_URL] = type.repos_root_URL
770
- r_info[:copyfrom_rev] = type.copyfrom_rev
771
- r_info[:copyfrom_url] = type.copyfrom_url
772
- #r_info[:working_size] = type.working_size
773
- r_info[:conflict_wrk] = type.conflict_wrk
774
- r_info[:conflict_new] = type.conflict_new
775
- r_info[:has_wc_info] = type.has_wc_info
776
- r_info[:repos_UUID] = type.repos_UUID
777
- r_info[:checksum] = type.checksum
778
- r_info[:prop_time], r_info[:text_time] = type.prop_time, type.text_time
779
- r_info[:prejfile], r_info[:schedule] = type.prejfile, type.schedule
780
- r_info[:taguri], r_info[:lock] = type.taguri, type.lock
781
- r_info[:rev], r_info[:dup] = type.rev, type.dup
782
- r_info[:url], r_info[:URL] = type.url, type.URL
783
- #r_info[:changelist] = type.changelist
784
- #r_info[:depth], r_info[:size] = type.depth, type.size
744
+ type_info.each do |t_info|
745
+ r_info[:"#{t_info}"] = type.method(:"#{t_info}").call
746
+ end
785
747
  end
786
748
  #rescue Svn::Error::WcNotDirectory => e
787
749
  # #Svn::Error::RaIllegalUrl,
@@ -869,7 +831,7 @@ module SvnWc
869
831
  # TODO support other propset's ; also propget
870
832
  #++
871
833
  def propset(type, files, dir_path=self.svn_repo_working_copy)
872
- raise RepoAccessError, '"ignore" is only supported propset' \
834
+ raise RepoAccessError, 'currently, "ignore" is the only supported propset' \
873
835
  unless type == 'ignore'
874
836
 
875
837
  svn_session() do |svn|
data/test/svn_wc_test.rb CHANGED
@@ -619,9 +619,9 @@ class TestSvnWc < Test::Unit::TestCase
619
619
 
620
620
  entries = svn.list_entries
621
621
 
622
- assert_equal File.basename(entries[1][:entry_name]),
623
- File.basename(file)
624
622
  assert_equal File.basename(entries[0][:entry_name]),
623
+ File.basename(file)
624
+ assert_equal File.basename(entries[1][:entry_name]),
625
625
  File.basename(file2)
626
626
  assert_equal entries.size, 2
627
627
  assert_nil entries[2]
@@ -632,14 +632,14 @@ class TestSvnWc < Test::Unit::TestCase
632
632
  # bools
633
633
  assert ! info[:absent]
634
634
  assert ! info[:entry_conflict]
635
- assert ! info[:is_add]
636
- assert ! info[:is_dir]
635
+ assert ! info[:add?]
636
+ assert ! info[:dir?]
637
637
  assert ! info[:has_props]
638
638
  assert ! info[:deleted]
639
639
  #assert ! info[:keep_local]
640
640
  assert ! info[:has_prop_mods]
641
641
  assert info[:normal?]
642
- assert info[:is_file]
642
+ assert info[:file?]
643
643
 
644
644
  assert_nil info[:copyfrom_url]
645
645
  assert_nil info[:conflict_old]
@@ -671,6 +671,20 @@ class TestSvnWc < Test::Unit::TestCase
671
671
  assert_equal info[:repos], @conf['svn_repo_master']
672
672
  end
673
673
 
674
+ # list and list_entries report the same entry path
675
+ list_entries = []
676
+ entries.each do |info|
677
+ list_entries.push info[:entry_name]
678
+ end
679
+
680
+ entries = []
681
+ svn.list.each do |info|
682
+ next unless info[:entry].match(/\.txt$/)
683
+ entries.push info[:entry]
684
+ end
685
+
686
+ assert_equal entries, list_entries
687
+
674
688
  end
675
689
 
676
690
  def test_propset_ignore_file
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: svn_wc
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 21
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 4
9
- version: 0.0.4
9
+ - 5
10
+ version: 0.0.5
10
11
  platform: ruby
11
12
  authors:
12
13
  - David Wright
@@ -14,7 +15,7 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-02-26 00:00:00 -08:00
18
+ date: 2010-10-11 00:00:00 -07:00
18
19
  default_executable:
19
20
  dependencies: []
20
21
 
@@ -44,23 +45,27 @@ rdoc_options: []
44
45
  require_paths:
45
46
  - lib
46
47
  required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
47
49
  requirements:
48
50
  - - ">="
49
51
  - !ruby/object:Gem::Version
52
+ hash: 3
50
53
  segments:
51
54
  - 0
52
55
  version: "0"
53
56
  required_rubygems_version: !ruby/object:Gem::Requirement
57
+ none: false
54
58
  requirements:
55
59
  - - ">="
56
60
  - !ruby/object:Gem::Version
61
+ hash: 3
57
62
  segments:
58
63
  - 0
59
64
  version: "0"
60
65
  requirements: []
61
66
 
62
67
  rubyforge_project:
63
- rubygems_version: 1.3.6
68
+ rubygems_version: 1.3.7
64
69
  signing_key:
65
70
  specification_version: 3
66
71
  summary: svn_wc operates on a working copy (on the local filesystem) of a remote Subversion repository.