svn_wc 0.0.4 → 0.0.5

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