rscm 0.4.0 → 0.4.2
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.
- data/CHANGES +14 -0
- data/README +1 -1
- data/lib/rscm/base.rb +2 -2
- data/lib/rscm/command_line.rb +64 -19
- data/lib/rscm/path_converter.rb +8 -14
- data/lib/rscm/platform.rb +2 -2
- data/lib/rscm/scm/clearcase.rb +19 -17
- data/lib/rscm/scm/subversion.rb +6 -6
- data/lib/rscm/scm/subversion_log_parser.rb +12 -3
- data/lib/rscm/scm/subversion_log_parser.rb.rej +39 -0
- data/lib/rscm/version.rb +1 -1
- data/test/rscm/command_line_test.rb +38 -0
- data/test/rscm/generic_scm_tests.rb +6 -6
- data/test/rscm/path_converter_test.rb +1 -1
- metadata +109 -101
    
        data/CHANGES
    CHANGED
    
    | @@ -1,5 +1,19 @@ | |
| 1 1 | 
             
            = RSCM Changelog
         | 
| 2 2 |  | 
| 3 | 
            +
            == 0.4.2
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            This release fixes a number of subtle bugs related to command lines and logging
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * Subversion no longer adds 1 to the from_identifier when getting revisions (avoid stderr and exitcode -1)
         | 
| 8 | 
            +
            * Improved tests and documentation for CommandLine class
         | 
| 9 | 
            +
            * stdout and stderr options are now optional
         | 
| 10 | 
            +
            * Fixed incorrect path escaping on win32
         | 
| 11 | 
            +
            * Fixed broken CVS trigger mechanism
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            == Version 0.4.1
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            * Minor subversion improvements. Fixes #1 [aslak]
         | 
| 16 | 
            +
             | 
| 3 17 | 
             
            == Version 0.4.0
         | 
| 4 18 |  | 
| 5 19 | 
             
            This release of RSCM modifies mosts API methods to take an options Hash (or alternatively, setting
         | 
    
        data/README
    CHANGED
    
    
    
        data/lib/rscm/base.rb
    CHANGED
    
    | @@ -54,12 +54,12 @@ module RSCM | |
| 54 54 | 
             
                end
         | 
| 55 55 |  | 
| 56 56 | 
             
                # Destroys the working copy
         | 
| 57 | 
            -
                def destroy_working_copy
         | 
| 57 | 
            +
                def destroy_working_copy(options={})
         | 
| 58 58 | 
             
                  FileUtils.rm_rf(checkout_dir) unless checkout_dir.nil?
         | 
| 59 59 | 
             
                end
         | 
| 60 60 |  | 
| 61 61 | 
             
                # Whether or not the SCM represented by this instance exists.
         | 
| 62 | 
            -
                def central_exists?
         | 
| 62 | 
            +
                def central_exists?(options={})
         | 
| 63 63 | 
             
                  # The default implementation assumes yes - override if it can be
         | 
| 64 64 | 
             
                  # determined programmatically.
         | 
| 65 65 | 
             
                  true
         | 
    
        data/lib/rscm/command_line.rb
    CHANGED
    
    | @@ -1,11 +1,6 @@ | |
| 1 | 
            +
            require 'rscm/platform'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module RSCM
         | 
| 2 | 
            -
              # Utility for running a +cmd+ in a +dir+ with a specified +env+.
         | 
| 3 | 
            -
              # If a block is passed, the standard out stream is passed to that block (and returns)
         | 
| 4 | 
            -
              # the result from the block. Otherwise, if a block is not passed, standard output
         | 
| 5 | 
            -
              # is redirected to +stdout_file+. The standard error stream is always redirected
         | 
| 6 | 
            -
              # to +stderr_file+. Note that both +stdout_file+ and +stderr_file+ must always
         | 
| 7 | 
            -
              # be specified with non-nil values, as both of them will always have the command lines
         | 
| 8 | 
            -
              # written to them.
         | 
| 9 4 | 
             
              module CommandLine
         | 
| 10 5 | 
             
                class OptionError < StandardError; end
         | 
| 11 6 | 
             
                class ExecutionError < StandardError
         | 
| @@ -15,35 +10,74 @@ module RSCM | |
| 15 10 | 
             
                    "\ndir       : #{@dir}\n" +
         | 
| 16 11 | 
             
                    "command   : #{@cmd}\n" +
         | 
| 17 12 | 
             
                    "exitstatus: #{@exitstatus}\n" +
         | 
| 18 | 
            -
                    " | 
| 13 | 
            +
                    "STDERR TAIL START\n#{@stderr}\nSTDERR TAIL END\n"
         | 
| 19 14 | 
             
                  end
         | 
| 20 15 | 
             
                end
         | 
| 21 16 |  | 
| 17 | 
            +
                # Executes +cmd+.
         | 
| 18 | 
            +
                # If the +:stdout+ and +:stderr+ options are specified, a line consisting
         | 
| 19 | 
            +
                # of a prompt (including +cmd+) will be appended to the respective output streams will be appended 
         | 
| 20 | 
            +
                # to those files, followed by the output itself. Example:
         | 
| 21 | 
            +
                #
         | 
| 22 | 
            +
                #   CommandLine.execute("echo hello world", {:stdout => "stdout.log", :stderr => "stderr.log"})
         | 
| 23 | 
            +
                #
         | 
| 24 | 
            +
                # will result in the following being written to stdout.log:
         | 
| 25 | 
            +
                #
         | 
| 26 | 
            +
                #   /Users/aslakhellesoy/scm/buildpatterns/repos/damagecontrol/trunk aslakhellesoy$ echo hello world
         | 
| 27 | 
            +
                #   hello world
         | 
| 28 | 
            +
                #
         | 
| 29 | 
            +
                # -and to stderr.log:
         | 
| 30 | 
            +
                #   /Users/aslakhellesoy/scm/buildpatterns/repos/damagecontrol/trunk aslakhellesoy$ echo hello world
         | 
| 31 | 
            +
                #
         | 
| 32 | 
            +
                # If a block is passed, the stdout io will be yielded to it (as with IO.popen). In this case the output
         | 
| 33 | 
            +
                # will not be written to the stdout file (even if it's specified):
         | 
| 34 | 
            +
                #
         | 
| 35 | 
            +
                #   /Users/aslakhellesoy/scm/buildpatterns/repos/damagecontrol/trunk aslakhellesoy$ echo hello world
         | 
| 36 | 
            +
                #   [output captured and therefore not logged]
         | 
| 37 | 
            +
                #
         | 
| 38 | 
            +
                # If the exitstatus of the command is different from the value specified by the +:exitstatus+ option
         | 
| 39 | 
            +
                # (which defaults to 0) then an ExecutionError is raised, its message containing the last 400 bytes of stderr 
         | 
| 40 | 
            +
                # (provided +:stderr+ was specified)
         | 
| 41 | 
            +
                #
         | 
| 42 | 
            +
                # You can also specify the +:dir+ option, which will cause the command to be executed in that directory
         | 
| 43 | 
            +
                # (default is current directory).
         | 
| 44 | 
            +
                #
         | 
| 45 | 
            +
                # You can also specify a hash of environment variables in +:env+, which will add additional environment variables
         | 
| 46 | 
            +
                # to the default environment.
         | 
| 47 | 
            +
                # 
         | 
| 48 | 
            +
                # Finally, you can specify several commands within one by separating them with '&&' (as you would in a shell).
         | 
| 49 | 
            +
                # This will result in several lines to be appended to the log (as if you had executed the commands separately).
         | 
| 50 | 
            +
                #
         | 
| 51 | 
            +
                # See the unit test for more examples.
         | 
| 22 52 | 
             
                def execute(cmd, options={}, &proc)
         | 
| 53 | 
            +
                  raise "Can't have newline in cmd" if cmd =~ /\n/
         | 
| 23 54 | 
             
                  options = {
         | 
| 24 55 | 
             
                    :dir => Dir.pwd,
         | 
| 25 56 | 
             
                    :env => {},
         | 
| 26 57 | 
             
                    :exitstatus => 0
         | 
| 27 58 | 
             
                  }.merge(options)
         | 
| 28 59 |  | 
| 29 | 
            -
                   | 
| 30 | 
            -
                   | 
| 31 | 
            -
                  options[:stdout] = File.expand_path(options[:stdout])
         | 
| 32 | 
            -
                  options[:stderr] = File.expand_path(options[:stderr])
         | 
| 60 | 
            +
                  options[:stdout] = File.expand_path(options[:stdout]) if options[:stdout]
         | 
| 61 | 
            +
                  options[:stderr] = File.expand_path(options[:stderr]) if options[:stderr]
         | 
| 33 62 |  | 
| 34 63 | 
             
                  commands = cmd.split("&&").collect{|c| c.strip}
         | 
| 35 64 | 
             
                  Dir.chdir(options[:dir]) do
         | 
| 36 | 
            -
                     | 
| 37 | 
            -
             | 
| 65 | 
            +
                    stdout_opt = options[:stdout] ? ">> #{options[:stdout]}" : ""
         | 
| 66 | 
            +
                    stderr_opt = options[:stderr] ? "2>> #{options[:stderr]}" : ""
         | 
| 67 | 
            +
                    capture_info_command = block_given? ? "echo [output captured and therefore not logged] >> #{options[:stdout]} && " : ""
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    full_cmd = commands.collect do |c|
         | 
| 70 | 
            +
                      escaped_command = c.gsub(/"/, "\\\"").gsub(/</, "\\<")
         | 
| 71 | 
            +
                      stdout_prompt_command = options[:stdout] ? "echo #{RSCM::Platform.prompt} #{escaped_command} >> #{options[:stdout]} && " : ""
         | 
| 72 | 
            +
                      stderr_prompt_command = options[:stderr] ? "echo #{RSCM::Platform.prompt} #{escaped_command} >> #{options[:stderr]} && " : ""
         | 
| 73 | 
            +
                      redirected_command = block_given? ? "#{c} #{stderr_opt}" : "#{c} #{stdout_opt} #{stderr_opt}"
         | 
| 38 74 |  | 
| 39 | 
            -
                       | 
| 40 | 
            -
                      "echo #{RSCM::Platform.prompt} #{c} >> #{options[:stderr]} && " +
         | 
| 41 | 
            -
                      redirection
         | 
| 75 | 
            +
                      stdout_prompt_command + capture_info_command + stderr_prompt_command + redirected_command
         | 
| 42 76 | 
             
                    end.join(" && ")
         | 
| 43 77 |  | 
| 44 78 | 
             
                    options[:env].each{|k,v| ENV[k]=v}
         | 
| 45 79 | 
             
                    begin
         | 
| 46 | 
            -
                      IO.popen( | 
| 80 | 
            +
                      IO.popen(full_cmd) do |io|
         | 
| 47 81 | 
             
                        if(block_given?)
         | 
| 48 82 | 
             
                          return(proc.call(io))
         | 
| 49 83 | 
             
                        else
         | 
| @@ -52,9 +86,20 @@ module RSCM | |
| 52 86 | 
             
                      end
         | 
| 53 87 | 
             
                    rescue Errno::ENOENT => e
         | 
| 54 88 | 
             
                      File.open(options[:stderr], "a") {|io| io.write(e.message)}
         | 
| 89 | 
            +
                      raise ExecutionError.new(cmd, options[:dir], nil, e.message)
         | 
| 55 90 | 
             
                    ensure
         | 
| 56 91 | 
             
                      if($?.exitstatus != options[:exitstatus])
         | 
| 57 | 
            -
                        error_message =  | 
| 92 | 
            +
                        error_message = "#{options[:stderr]} doesn't exist"
         | 
| 93 | 
            +
                        if options[:stderr] && File.exist?(options[:stderr])
         | 
| 94 | 
            +
                          File.open(options[:stderr]) do |errio|
         | 
| 95 | 
            +
                            begin
         | 
| 96 | 
            +
                              errio.seek(-800, IO::SEEK_END)
         | 
| 97 | 
            +
                            rescue Errno::EINVAL
         | 
| 98 | 
            +
                              # ignore - it just means we didn't have 400 bytes.
         | 
| 99 | 
            +
                            end
         | 
| 100 | 
            +
                            error_message = errio.read
         | 
| 101 | 
            +
                          end
         | 
| 102 | 
            +
                        end
         | 
| 58 103 | 
             
                        raise ExecutionError.new(cmd, options[:dir], $?.exitstatus, error_message)
         | 
| 59 104 | 
             
                      end
         | 
| 60 105 | 
             
                    end
         | 
    
        data/lib/rscm/path_converter.rb
    CHANGED
    
    | @@ -11,17 +11,15 @@ module RSCM | |
| 11 11 | 
             
                  return nil if path.nil?
         | 
| 12 12 | 
             
                  path = File.expand_path(path)
         | 
| 13 13 | 
             
                  if(WIN32)
         | 
| 14 | 
            -
                    path.gsub(/\//, "\\")
         | 
| 14 | 
            +
                    escaped ? path.gsub(/\//, "\\\\\\\\") : path.gsub(/\//, "\\")
         | 
| 15 15 | 
             
                  elsif(CYGWIN)
         | 
| 16 | 
            -
                     | 
| 17 | 
            -
                     | 
| 18 | 
            -
                      cygpath = io.read.chomp
         | 
| 19 | 
            -
                      escaped ? cygpath.gsub(/\\/, "\\\\\\\\") : cygpath
         | 
| 20 | 
            -
                    end
         | 
| 16 | 
            +
                    cygpath = `cygpath --windows #{path}`.chomp
         | 
| 17 | 
            +
                    escaped ? cygpath.gsub(/\\/, "\\\\\\\\") : cygpath
         | 
| 21 18 | 
             
                  else
         | 
| 22 19 | 
             
                    path
         | 
| 23 20 | 
             
                  end
         | 
| 24 21 | 
             
                end
         | 
| 22 | 
            +
                module_function :filepath_to_nativepath
         | 
| 25 23 |  | 
| 26 24 | 
             
                def filepath_to_nativeurl(path)
         | 
| 27 25 | 
             
                  return nil if path.nil?
         | 
| @@ -32,6 +30,7 @@ module RSCM | |
| 32 30 | 
             
                    "file://#{File.expand_path(path)}"
         | 
| 33 31 | 
             
                  end
         | 
| 34 32 | 
             
                end
         | 
| 33 | 
            +
                module_function :filepath_to_nativeurl
         | 
| 35 34 |  | 
| 36 35 | 
             
                def nativepath_to_filepath(path)
         | 
| 37 36 | 
             
                  return nil if path.nil?
         | 
| @@ -40,14 +39,12 @@ module RSCM | |
| 40 39 | 
             
                    path.gsub(/\//, "\\")
         | 
| 41 40 | 
             
                  elsif(CYGWIN)
         | 
| 42 41 | 
             
                    path = path.gsub(/\\/, "/")
         | 
| 43 | 
            -
                     | 
| 44 | 
            -
                    Better.popen(cmd) do |io|
         | 
| 45 | 
            -
                      io.read.chomp
         | 
| 46 | 
            -
                    end
         | 
| 42 | 
            +
                    `cygpath --unix #{path}`.chomp
         | 
| 47 43 | 
             
                  else
         | 
| 48 44 | 
             
                    path
         | 
| 49 45 | 
             
                  end
         | 
| 50 46 | 
             
                end
         | 
| 47 | 
            +
                module_function :nativepath_to_filepath
         | 
| 51 48 |  | 
| 52 49 | 
             
                def ensure_trailing_slash(url)
         | 
| 53 50 | 
             
                  return nil if url.nil?
         | 
| @@ -57,10 +54,7 @@ module RSCM | |
| 57 54 | 
             
                    url
         | 
| 58 55 | 
             
                  end
         | 
| 59 56 | 
             
                end
         | 
| 60 | 
            -
             | 
| 61 | 
            -
                module_function :filepath_to_nativepath
         | 
| 62 | 
            -
                module_function :filepath_to_nativeurl
         | 
| 63 | 
            -
                module_function :nativepath_to_filepath
         | 
| 64 57 | 
             
                module_function :ensure_trailing_slash
         | 
| 58 | 
            +
             | 
| 65 59 | 
             
              end
         | 
| 66 60 | 
             
            end
         | 
    
        data/lib/rscm/platform.rb
    CHANGED
    
    | @@ -7,8 +7,8 @@ module RSCM | |
| 7 7 | 
             
                  return "powerpc-darwin" if target_os.downcase =~ /darwin/
         | 
| 8 8 | 
             
                  return "mswin32"  if target_os.downcase =~ /32/
         | 
| 9 9 | 
             
                  return "cygwin" if target_os.downcase =~ /cyg/
         | 
| 10 | 
            -
                   | 
| 11 | 
            -
                   | 
| 10 | 
            +
                  return "freebsd" if target_os.downcase =~ /freebsd/
         | 
| 11 | 
            +
                  raise "Unsupported OS: #{target_os}"
         | 
| 12 12 | 
             
                end
         | 
| 13 13 | 
             
                module_function :family
         | 
| 14 14 |  | 
    
        data/lib/rscm/scm/clearcase.rb
    CHANGED
    
    | @@ -22,7 +22,13 @@ module RSCM | |
| 22 22 | 
             
                  @stream, @stgloc, @tag, @config_spec = stream, stgloc, tag, config_spec
         | 
| 23 23 | 
             
                end
         | 
| 24 24 |  | 
| 25 | 
            -
                def revisions(from_identifier,  | 
| 25 | 
            +
                def revisions(from_identifier, options={})
         | 
| 26 | 
            +
                  options = {
         | 
| 27 | 
            +
                    :from_identifier => from_identifier,
         | 
| 28 | 
            +
                    :to_identifier => Time.infinity, 
         | 
| 29 | 
            +
                    :relative_path => nil
         | 
| 30 | 
            +
                  }.merge(options)
         | 
| 31 | 
            +
             | 
| 26 32 | 
             
                  checkout unless checked_out?
         | 
| 27 33 | 
             
                  rules = load_rules
         | 
| 28 34 | 
             
                  vob = vob(rules[0])
         | 
| @@ -35,7 +41,7 @@ module RSCM | |
| 35 41 | 
             
                  with_working_dir(checkout_dir) do
         | 
| 36 42 | 
             
                    since = (from_identifier + 1).strftime(TIME_FORMAT)
         | 
| 37 43 | 
             
                    cmd = "cleartool lshistory -recurse -nco -since #{since} -fmt \"#{LOG_FORMAT}\" -pname #{vob}"
         | 
| 38 | 
            -
                     | 
| 44 | 
            +
                    execute(cmd, options) do |io|
         | 
| 39 45 | 
             
                      # escape all quotes, except the one at the beginning and end. this is a bit ugly...
         | 
| 40 46 | 
             
                      raw_yaml = io.read
         | 
| 41 47 | 
             
                      fixed_yaml = raw_yaml.gsub(/^  message: \"/, "  message: #{MAGIC_TOKEN}")
         | 
| @@ -67,29 +73,29 @@ module RSCM | |
| 67 73 | 
             
                  !Dir["#{checkout_dir}/*"].empty?
         | 
| 68 74 | 
             
                end
         | 
| 69 75 |  | 
| 70 | 
            -
                def destroy_working_copy
         | 
| 71 | 
            -
                   | 
| 76 | 
            +
                def destroy_working_copy(options={})
         | 
| 77 | 
            +
                  execute("cleartool rmview #{checkout_dir}", options) do |io|
         | 
| 72 78 | 
             
                    io.read
         | 
| 73 79 | 
             
                  end
         | 
| 74 80 | 
             
                end
         | 
| 75 81 |  | 
| 76 | 
            -
                def import_central( | 
| 77 | 
            -
                   | 
| 82 | 
            +
                def import_central(options={})
         | 
| 83 | 
            +
                  execute("clearfsimport -recurse -nsetevent #{options[:dir]} #{checkout_dir}", options) do |io|
         | 
| 78 84 | 
             
                    io.read
         | 
| 79 85 | 
             
                  end
         | 
| 80 86 | 
             
                end
         | 
| 81 87 |  | 
| 82 88 | 
             
                ## Non-RSCM API methods
         | 
| 83 89 |  | 
| 84 | 
            -
                def mkview!
         | 
| 90 | 
            +
                def mkview!(options={})
         | 
| 85 91 | 
             
                   # Create view (working copy)
         | 
| 86 92 | 
             
                   mkview_cmd = "cleartool mkview -snapshot -stream #{@stream} -stgloc #{@stgloc} -tag #{@tag} #{@checkout_dir}"
         | 
| 87 | 
            -
                    | 
| 93 | 
            +
                   execute(mkview_cmd, options) do |io|
         | 
| 88 94 | 
             
                     puts io.read
         | 
| 89 95 | 
             
                   end
         | 
| 90 96 | 
             
                end
         | 
| 91 97 |  | 
| 92 | 
            -
                def update_load_rules!
         | 
| 98 | 
            +
                def update_load_rules!(options={})
         | 
| 93 99 | 
             
                  Dir.chdir(checkout_dir) do
         | 
| 94 100 | 
             
                    # tempfile is broken on windows (!!)
         | 
| 95 101 | 
             
                    cfg_spec_file = "__rscm.cfgspec"
         | 
| @@ -104,10 +110,10 @@ module RSCM | |
| 104 110 | 
             
                  end
         | 
| 105 111 | 
             
                end
         | 
| 106 112 |  | 
| 107 | 
            -
                def catcs
         | 
| 113 | 
            +
                def catcs(options={})
         | 
| 108 114 | 
             
                  Dir.chdir(checkout_dir) do
         | 
| 109 115 | 
             
                    catcs_cmd = "cleartool catcs"
         | 
| 110 | 
            -
                     | 
| 116 | 
            +
                    execute(catcs_cmd, options) do |io|
         | 
| 111 117 | 
             
                      yield io
         | 
| 112 118 | 
             
                    end
         | 
| 113 119 | 
             
                  end
         | 
| @@ -136,13 +142,9 @@ module RSCM | |
| 136 142 |  | 
| 137 143 | 
             
              protected
         | 
| 138 144 |  | 
| 139 | 
            -
                def checkout_silent(to_identifier= | 
| 145 | 
            +
                def checkout_silent(to_identifier, options={}, &proc)
         | 
| 140 146 | 
             
                  if(checked_out?)
         | 
| 141 | 
            -
                     | 
| 142 | 
            -
                      Better.popen("cleartool update .") do |io|
         | 
| 143 | 
            -
                        io.read
         | 
| 144 | 
            -
                      end
         | 
| 145 | 
            -
                    end
         | 
| 147 | 
            +
                    execute("cleartool update .", options)
         | 
| 146 148 | 
             
                  else
         | 
| 147 149 | 
             
                    mkview!
         | 
| 148 150 |  | 
    
        data/lib/rscm/scm/subversion.rb
    CHANGED
    
    | @@ -118,7 +118,7 @@ module RSCM | |
| 118 118 |  | 
| 119 119 | 
             
                def create_central(options={})
         | 
| 120 120 | 
             
                  options = options.dup.merge({:dir => svnrootdir})
         | 
| 121 | 
            -
                  native_path = PathConverter.filepath_to_nativepath(svnrootdir,  | 
| 121 | 
            +
                  native_path = PathConverter.filepath_to_nativepath(svnrootdir, false)
         | 
| 122 122 | 
             
                  mkdir_p(PathConverter.nativepath_to_filepath(native_path))
         | 
| 123 123 | 
             
                  svnadmin("create #{native_path}", options)
         | 
| 124 124 | 
             
                  if(@path && @path != "")
         | 
| @@ -168,7 +168,7 @@ module RSCM | |
| 168 168 | 
             
                  revisions = nil
         | 
| 169 169 | 
             
                  command = "svn #{changes_command(options[:from_identifier], options[:to_identifier], options[:relative_path])}"
         | 
| 170 170 | 
             
                  execute(command, options) do |stdout|
         | 
| 171 | 
            -
                    parser = SubversionLogParser.new(stdout, @url)
         | 
| 171 | 
            +
                    parser = SubversionLogParser.new(stdout, @url, options[:from_identifier])
         | 
| 172 172 | 
             
                    revisions = parser.parse_revisions
         | 
| 173 173 | 
             
                  end
         | 
| 174 174 | 
             
                  revisions
         | 
| @@ -305,7 +305,7 @@ module RSCM | |
| 305 305 | 
             
                def login_options
         | 
| 306 306 | 
             
                  result = ""
         | 
| 307 307 | 
             
                  u = @username ? @username.strip : ""
         | 
| 308 | 
            -
                  p = @password ? @password.strip : "
         | 
| 308 | 
            +
                  p = @password ? @password.strip : ""
         | 
| 309 309 | 
             
                  result << "--username #{u} " unless u == ""
         | 
| 310 310 | 
             
                  result << "--password #{p} " unless p == ""
         | 
| 311 311 | 
             
                  result
         | 
| @@ -315,9 +315,9 @@ module RSCM | |
| 315 315 | 
             
                  # The inclusive start
         | 
| 316 316 | 
             
                  from = nil
         | 
| 317 317 | 
             
                  if(from_identifier.is_a?(Time))
         | 
| 318 | 
            -
                    from = svndate(from_identifier | 
| 318 | 
            +
                    from = svndate(from_identifier)
         | 
| 319 319 | 
             
                  elsif(from_identifier.is_a?(Numeric))
         | 
| 320 | 
            -
                    from = from_identifier | 
| 320 | 
            +
                    from = from_identifier
         | 
| 321 321 | 
             
                  elsif(!from_identifier.nil?)
         | 
| 322 322 | 
             
                    raise "from_identifier must be Numeric, Time or nil. Was: #{from_identifier} (#{from_identifier.class.name})"
         | 
| 323 323 | 
             
                  end
         | 
| @@ -350,7 +350,7 @@ module RSCM | |
| 350 350 | 
             
                end
         | 
| 351 351 |  | 
| 352 352 | 
             
                def commit_command(message)
         | 
| 353 | 
            -
                  "commit -m \"#{message}\""
         | 
| 353 | 
            +
                  "commit #{login_options} --force-log -m \"#{message}\""
         | 
| 354 354 | 
             
                end
         | 
| 355 355 |  | 
| 356 356 | 
             
                def local?
         | 
| @@ -4,9 +4,10 @@ require 'rscm/revision' | |
| 4 4 | 
             
            module RSCM
         | 
| 5 5 |  | 
| 6 6 | 
             
              class SubversionLogParser
         | 
| 7 | 
            -
                def initialize(io, url)
         | 
| 7 | 
            +
                def initialize(io, url, exclude_below=nil)
         | 
| 8 8 | 
             
                  @io = io
         | 
| 9 9 | 
             
                  @revision_parser = SubversionLogEntryParser.new(url)
         | 
| 10 | 
            +
                  @exclude_below = exclude_below
         | 
| 10 11 | 
             
                end
         | 
| 11 12 |  | 
| 12 13 | 
             
                def parse_revisions(&line_proc)
         | 
| @@ -16,7 +17,15 @@ module RSCM | |
| 16 17 | 
             
                  while(!@io.eof?)
         | 
| 17 18 | 
             
                    revision = @revision_parser.parse(@io, &line_proc)
         | 
| 18 19 | 
             
                    if(revision)
         | 
| 19 | 
            -
                       | 
| 20 | 
            +
                      # Filter out the lower bound to avoid inclusiveness of the lower bound (see contract)
         | 
| 21 | 
            +
                      # We're doing this instead of increasing the from_identifer with 1, since that causes an error.
         | 
| 22 | 
            +
                      exclude = false
         | 
| 23 | 
            +
                      if(@exclude_below.is_a? Time)
         | 
| 24 | 
            +
                        exclude = revision.time <= @exclude_below
         | 
| 25 | 
            +
                      elsif(@exclude_below.is_a? Numeric)
         | 
| 26 | 
            +
                        exclude = revision.identifier <= @exclude_below
         | 
| 27 | 
            +
                      end
         | 
| 28 | 
            +
                      revisions.add(revision) unless exclude
         | 
| 20 29 | 
             
                    end
         | 
| 21 30 | 
             
                  end
         | 
| 22 31 | 
             
                  revisions
         | 
| @@ -38,6 +47,7 @@ module RSCM | |
| 38 47 | 
             
                end
         | 
| 39 48 |  | 
| 40 49 | 
             
                def relative_path(url, repo_path)
         | 
| 50 | 
            +
                  repo_path = repo_path.chomp
         | 
| 41 51 | 
             
                  url_tokens = url.split('/')
         | 
| 42 52 | 
             
                  repo_path_tokens = repo_path.split('/')
         | 
| 43 53 |  | 
| @@ -125,7 +135,6 @@ module RSCM | |
| 125 135 | 
             
                  return if rp.nil?
         | 
| 126 136 | 
             
                  file.path = rp
         | 
| 127 137 |  | 
| 128 | 
            -
                  
         | 
| 129 138 | 
             
            #      if(@path.length+1 == path_from_root.length)
         | 
| 130 139 | 
             
            #        file.path = path_from_root[@path.length+1..-1]
         | 
| 131 140 | 
             
            #      else
         | 
| @@ -0,0 +1,39 @@ | |
| 1 | 
            +
            ***************
         | 
| 2 | 
            +
            *** 38,43 ****
         | 
| 3 | 
            +
                  end
         | 
| 4 | 
            +
              
         | 
| 5 | 
            +
                  def relative_path(url, repo_path)
         | 
| 6 | 
            +
                    url_tokens = url.split('/')
         | 
| 7 | 
            +
                    repo_path_tokens = repo_path.split('/')
         | 
| 8 | 
            +
                    
         | 
| 9 | 
            +
            --- 38,45 ----
         | 
| 10 | 
            +
                  end
         | 
| 11 | 
            +
              
         | 
| 12 | 
            +
                  def relative_path(url, repo_path)
         | 
| 13 | 
            +
            + 	  repo_path.chomp!
         | 
| 14 | 
            +
            + 	  
         | 
| 15 | 
            +
                    url_tokens = url.split('/')
         | 
| 16 | 
            +
                    repo_path_tokens = repo_path.split('/')
         | 
| 17 | 
            +
                    
         | 
| 18 | 
            +
            ***************
         | 
| 19 | 
            +
            *** 50,60 ****
         | 
| 20 | 
            +
                      end
         | 
| 21 | 
            +
                      max_similar -= 1
         | 
| 22 | 
            +
                    end
         | 
| 23 | 
            +
            -       if(max_similar == 0) 
         | 
| 24 | 
            +
            -         nil
         | 
| 25 | 
            +
            -       else
         | 
| 26 | 
            +
            -         repo_path_tokens[max_similar..-1].join("/")
         | 
| 27 | 
            +
            -       end
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                  
         | 
| 30 | 
            +
                protected
         | 
| 31 | 
            +
            --- 52,59 ----
         | 
| 32 | 
            +
                      end
         | 
| 33 | 
            +
                      max_similar -= 1
         | 
| 34 | 
            +
                    end
         | 
| 35 | 
            +
            +       
         | 
| 36 | 
            +
            +       repo_path_tokens[max_similar..-1].join("/")
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
                  
         | 
| 39 | 
            +
                protected
         | 
    
        data/lib/rscm/version.rb
    CHANGED
    
    
| @@ -0,0 +1,38 @@ | |
| 1 | 
            +
            require 'test/unit'
         | 
| 2 | 
            +
            require 'rscm/tempdir'
         | 
| 3 | 
            +
            require 'rscm/command_line'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module RSCM
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              class DifftoolTest < Test::Unit::TestCase
         | 
| 8 | 
            +
                def setup
         | 
| 9 | 
            +
                  @dir = RSCM.new_temp_dir("test_should_write_to_stdout")
         | 
| 10 | 
            +
                  @stdout = "#{@dir}/stdout"
         | 
| 11 | 
            +
                  @stderr = "#{@dir}/stderr"
         | 
| 12 | 
            +
                  @prompt = "#{File.expand_path(@dir)} #{Platform.user}$"
         | 
| 13 | 
            +
                  File.delete @stdout if File.exist? @stdout
         | 
| 14 | 
            +
                  File.delete @stderr if File.exist? @stderr
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def test_should_write_to_both_when_both_streams_specified_and_no_block
         | 
| 18 | 
            +
                  CommandLine.execute("echo \"<hello\" && echo world", {:dir => @dir, :stdout => @stdout, :stderr => @stderr})
         | 
| 19 | 
            +
                  assert_equal("#{@prompt} echo \"<hello\"\n<hello\n#{@prompt} echo world\nworld\n", File.open(@stdout).read)
         | 
| 20 | 
            +
                  assert_equal("#{@prompt} echo \"<hello\"\n#{@prompt} echo world\n", File.open(@stderr).read)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                def test_should_not_write_to_stdout_when_no_stdout_specified
         | 
| 24 | 
            +
                  CommandLine.execute("echo hello", {:dir => @dir, :stderr => @stderr})
         | 
| 25 | 
            +
                  assert(!File.exist?(@stdout))
         | 
| 26 | 
            +
                  assert_equal("#{@prompt} echo hello\n", File.open(@stderr).read)
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
                
         | 
| 29 | 
            +
                def test_should_only_write_command_to_stdout_when_block_specified
         | 
| 30 | 
            +
                  CommandLine.execute("echo hello", {:dir => @dir, :stdout => @stdout, :stderr => @stderr}) do |io|
         | 
| 31 | 
            +
                    assert_equal("hello\n", io.read)
         | 
| 32 | 
            +
                  end
         | 
| 33 | 
            +
                  assert_equal("#{@prompt} echo hello\n[output captured and therefore not logged]\n", File.open(@stdout).read)
         | 
| 34 | 
            +
                  assert_equal("#{@prompt} echo hello\n", File.open(@stderr).read)
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
                
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
            end
         | 
| @@ -82,7 +82,7 @@ module RSCM | |
| 82 82 |  | 
| 83 83 | 
             
                  # 6
         | 
| 84 84 | 
             
                  initial_revisions = scm.revisions(nil)
         | 
| 85 | 
            -
                  assert_equal("imported | 
| 85 | 
            +
                  assert_equal("imported sources", initial_revisions[0].message)
         | 
| 86 86 | 
             
                  # Subversion seems to add a revision with message "Added directories"
         | 
| 87 87 | 
             
                  #assert_equal(1, initial_revisions.length)
         | 
| 88 88 | 
             
                  assert_equal(4, initial_revisions[0].length)
         | 
| @@ -99,7 +99,7 @@ module RSCM | |
| 99 99 | 
             
                  assert(other_scm.uptodate?(initial_revisions.latest.identifier))
         | 
| 100 100 |  | 
| 101 101 | 
             
                  sleep(1)
         | 
| 102 | 
            -
                  scm.commit("changed | 
| 102 | 
            +
                  scm.commit("changed something") 
         | 
| 103 103 |  | 
| 104 104 | 
             
                  # 13
         | 
| 105 105 | 
             
                  revisions = scm.revisions(initial_revisions.latest.identifier)
         | 
| @@ -109,7 +109,7 @@ module RSCM | |
| 109 109 | 
             
                  revision = revisions[0]
         | 
| 110 110 | 
             
                  assert_equal(2, revision.length, "Actual files:\n" + revision.collect{|file| file.path}.join("\n"))
         | 
| 111 111 |  | 
| 112 | 
            -
                  assert_equal("changed | 
| 112 | 
            +
                  assert_equal("changed something", revision.message)
         | 
| 113 113 |  | 
| 114 114 | 
             
                  # why is this nil when running as the dcontrol user on codehaus? --jon
         | 
| 115 115 | 
             
                  #assert_equal(username, revision.developer)
         | 
| @@ -179,8 +179,8 @@ module RSCM | |
| 179 179 | 
             
                  @scm = scm
         | 
| 180 180 |  | 
| 181 181 | 
             
                  # Verify that install/uninstall works
         | 
| 182 | 
            -
                  touch = WINDOWS ? PathConverter.filepath_to_nativepath(File.dirname(__FILE__) + "../../../bin/touch.exe",  | 
| 183 | 
            -
                  trigger_command = "#{touch} " + PathConverter.filepath_to_nativepath(trigger_proof,  | 
| 182 | 
            +
                  touch = WINDOWS ? PathConverter.filepath_to_nativepath(File.dirname(__FILE__) + "../../../bin/touch.exe", true) : "touch"
         | 
| 183 | 
            +
                  trigger_command = "#{touch} " + PathConverter.filepath_to_nativepath(trigger_proof, true)
         | 
| 184 184 | 
             
                  trigger_files_checkout_dir = File.expand_path("#{checkout_dir}/../trigger")
         | 
| 185 185 | 
             
                  (1..3).each do |i|
         | 
| 186 186 | 
             
                    assert(!scm.trigger_installed?(trigger_command, trigger_files_checkout_dir))
         | 
| @@ -333,7 +333,7 @@ EOF | |
| 333 333 | 
             
                  cp_r(path, dirname)
         | 
| 334 334 | 
             
                  todelete = Dir.glob("#{import_copy_dir}/**/.svn")
         | 
| 335 335 | 
             
                  rm_rf(todelete)
         | 
| 336 | 
            -
                  scm.import_central :dir => import_copy_dir, :message => "imported | 
| 336 | 
            +
                  scm.import_central :dir => import_copy_dir, :message => "imported sources"
         | 
| 337 337 | 
             
                end
         | 
| 338 338 |  | 
| 339 339 | 
             
                def change_file(scm, file)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 | 
            -
            rubygems_version: 0.8. | 
| 2 | 
            +
            rubygems_version: 0.8.11
         | 
| 3 3 | 
             
            specification_version: 1
         | 
| 4 4 | 
             
            name: rscm
         | 
| 5 5 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 6 | 
            -
              version: 0.4. | 
| 7 | 
            -
            date: 2006- | 
| 8 | 
            -
            summary:  | 
| 6 | 
            +
              version: 0.4.2
         | 
| 7 | 
            +
            date: 2006-02-27 00:00:00 -06:00
         | 
| 8 | 
            +
            summary: RSCM - Ruby Source Control Management
         | 
| 9 9 | 
             
            require_paths: 
         | 
| 10 | 
            -
             | 
| 10 | 
            +
            - lib
         | 
| 11 11 | 
             
            email: dev@damagecontrol.codehaus.org
         | 
| 12 12 | 
             
            homepage: http://rscm.rubyforge.org
         | 
| 13 13 | 
             
            rubyforge_project: rscm
         | 
| @@ -18,109 +18,117 @@ bindir: bin | |
| 18 18 | 
             
            has_rdoc: true
         | 
| 19 19 | 
             
            required_ruby_version: !ruby/object:Gem::Version::Requirement 
         | 
| 20 20 | 
             
              requirements: 
         | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
                   | 
| 24 | 
            -
                    version: 0.0.0
         | 
| 21 | 
            +
              - - ">"
         | 
| 22 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 23 | 
            +
                  version: 0.0.0
         | 
| 25 24 | 
             
              version: 
         | 
| 26 25 | 
             
            platform: ruby
         | 
| 26 | 
            +
            signing_key: 
         | 
| 27 | 
            +
            cert_chain: 
         | 
| 27 28 | 
             
            authors: 
         | 
| 28 | 
            -
             | 
| 29 | 
            +
            - Aslak Hellesoy
         | 
| 29 30 | 
             
            files: 
         | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
             | 
| 49 | 
            -
             | 
| 50 | 
            -
             | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 77 | 
            -
             | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
             | 
| 87 | 
            -
             | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
             | 
| 91 | 
            -
             | 
| 92 | 
            -
             | 
| 93 | 
            -
             | 
| 94 | 
            -
             | 
| 95 | 
            -
             | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 104 | 
            -
             | 
| 105 | 
            -
             | 
| 106 | 
            -
             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 109 | 
            -
             | 
| 110 | 
            -
             | 
| 111 | 
            -
             | 
| 112 | 
            -
             | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 31 | 
            +
            - CHANGES
         | 
| 32 | 
            +
            - Rakefile
         | 
| 33 | 
            +
            - README
         | 
| 34 | 
            +
            - lib/rscm
         | 
| 35 | 
            +
            - lib/rscm.rb
         | 
| 36 | 
            +
            - lib/rscm/abstract_log_parser.rb
         | 
| 37 | 
            +
            - lib/rscm/base.rb
         | 
| 38 | 
            +
            - lib/rscm/command_line.rb
         | 
| 39 | 
            +
            - lib/rscm/difftool.rb
         | 
| 40 | 
            +
            - lib/rscm/historic_file.rb
         | 
| 41 | 
            +
            - lib/rscm/line_editor.rb
         | 
| 42 | 
            +
            - lib/rscm/mockit.rb
         | 
| 43 | 
            +
            - lib/rscm/parser.rb
         | 
| 44 | 
            +
            - lib/rscm/path_converter.rb
         | 
| 45 | 
            +
            - lib/rscm/platform.rb
         | 
| 46 | 
            +
            - lib/rscm/revision.rb
         | 
| 47 | 
            +
            - lib/rscm/revision_file.rb
         | 
| 48 | 
            +
            - lib/rscm/revision_poller.rb
         | 
| 49 | 
            +
            - lib/rscm/scm
         | 
| 50 | 
            +
            - lib/rscm/tempdir.rb
         | 
| 51 | 
            +
            - lib/rscm/time_ext.rb
         | 
| 52 | 
            +
            - lib/rscm/version.rb
         | 
| 53 | 
            +
            - lib/rscm/scm/clearcase.rb
         | 
| 54 | 
            +
            - lib/rscm/scm/cvs.rb
         | 
| 55 | 
            +
            - lib/rscm/scm/cvs_log_parser.rb
         | 
| 56 | 
            +
            - lib/rscm/scm/darcs.rb
         | 
| 57 | 
            +
            - lib/rscm/scm/darcs_log_parser.rb
         | 
| 58 | 
            +
            - lib/rscm/scm/monotone.rb
         | 
| 59 | 
            +
            - lib/rscm/scm/monotone_log_parser.rb
         | 
| 60 | 
            +
            - lib/rscm/scm/mooky.rb
         | 
| 61 | 
            +
            - lib/rscm/scm/perforce.rb
         | 
| 62 | 
            +
            - lib/rscm/scm/star_team.rb
         | 
| 63 | 
            +
            - lib/rscm/scm/subversion.rb
         | 
| 64 | 
            +
            - lib/rscm/scm/subversion_log_parser.rb
         | 
| 65 | 
            +
            - lib/rscm/scm/subversion_log_parser.rb.rej
         | 
| 66 | 
            +
            - bin/diff.exe
         | 
| 67 | 
            +
            - bin/Diff_StdDisclaimer.html
         | 
| 68 | 
            +
            - bin/touch.exe
         | 
| 69 | 
            +
            - test/rscm
         | 
| 70 | 
            +
            - test/rscm/apply_label_scm_tests.rb
         | 
| 71 | 
            +
            - test/rscm/command_line_test.rb
         | 
| 72 | 
            +
            - test/rscm/difftool_test.rb
         | 
| 73 | 
            +
            - test/rscm/file_after_edit
         | 
| 74 | 
            +
            - test/rscm/file_ext.rb
         | 
| 75 | 
            +
            - test/rscm/file_to_edit
         | 
| 76 | 
            +
            - test/rscm/generic_scm_tests.rb
         | 
| 77 | 
            +
            - test/rscm/line_editor_test.rb
         | 
| 78 | 
            +
            - test/rscm/mockit_test.rb
         | 
| 79 | 
            +
            - test/rscm/parser_test.rb
         | 
| 80 | 
            +
            - test/rscm/path_converter_test.rb
         | 
| 81 | 
            +
            - test/rscm/revision_fixture.rb
         | 
| 82 | 
            +
            - test/rscm/revision_test.rb
         | 
| 83 | 
            +
            - test/rscm/revisions.yaml
         | 
| 84 | 
            +
            - test/rscm/scm
         | 
| 85 | 
            +
            - test/rscm/scm/cvs-dataforge.log
         | 
| 86 | 
            +
            - test/rscm/scm/cvs-test.log
         | 
| 87 | 
            +
            - test/rscm/scm/cvs_log_parser_test.rb
         | 
| 88 | 
            +
            - test/rscm/scm/cvs_test.rb
         | 
| 89 | 
            +
            - test/rscm/scm/darcs_log_parser_test.rb
         | 
| 90 | 
            +
            - test/rscm/scm/darcs_test.rb
         | 
| 91 | 
            +
            - test/rscm/scm/keys
         | 
| 92 | 
            +
            - test/rscm/scm/monotone_log_parser_test.rb
         | 
| 93 | 
            +
            - test/rscm/scm/monotone_test.rb
         | 
| 94 | 
            +
            - test/rscm/scm/mooky_test.rb
         | 
| 95 | 
            +
            - test/rscm/scm/p4client_test.rb
         | 
| 96 | 
            +
            - test/rscm/scm/perforce_test.rb
         | 
| 97 | 
            +
            - test/rscm/scm/star_team.rb
         | 
| 98 | 
            +
            - test/rscm/scm/subversion_log_parser_test.rb
         | 
| 99 | 
            +
            - test/rscm/scm/subversion_test.rb
         | 
| 100 | 
            +
            - test/rscm/scm/svn-cargo.log
         | 
| 101 | 
            +
            - test/rscm/scm/svn-growl.log
         | 
| 102 | 
            +
            - test/rscm/scm/svn-growl2.log
         | 
| 103 | 
            +
            - test/rscm/scm/svn-proxytoys.log
         | 
| 104 | 
            +
            - testproject/damagecontrolled
         | 
| 105 | 
            +
            - testproject/damagecontrolled/build.xml
         | 
| 106 | 
            +
            - testproject/damagecontrolled/project.xml
         | 
| 107 | 
            +
            - testproject/damagecontrolled/src
         | 
| 108 | 
            +
            - testproject/damagecontrolled/src/java
         | 
| 109 | 
            +
            - testproject/damagecontrolled/src/test
         | 
| 110 | 
            +
            - testproject/damagecontrolled/src/java/com
         | 
| 111 | 
            +
            - testproject/damagecontrolled/src/java/com/thoughtworks
         | 
| 112 | 
            +
            - testproject/damagecontrolled/src/java/com/thoughtworks/damagecontrolled
         | 
| 113 | 
            +
            - testproject/damagecontrolled/src/java/com/thoughtworks/damagecontrolled/Thingy.java
         | 
| 114 | 
            +
            - testproject/damagecontrolled/src/test/com
         | 
| 115 | 
            +
            - testproject/damagecontrolled/src/test/com/thoughtworks
         | 
| 116 | 
            +
            - testproject/damagecontrolled/src/test/com/thoughtworks/damagecontrolled
         | 
| 117 | 
            +
            - testproject/damagecontrolled/src/test/com/thoughtworks/damagecontrolled/ThingyTestCase.java
         | 
| 118 | 
            +
            - ext/rscm.jar
         | 
| 116 119 | 
             
            test_files: []
         | 
| 120 | 
            +
             | 
| 117 121 | 
             
            rdoc_options: 
         | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 122 | 
            +
            - --line-numbers
         | 
| 123 | 
            +
            - --inline-source
         | 
| 120 124 | 
             
            extra_rdoc_files: 
         | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 125 | 
            +
            - README
         | 
| 126 | 
            +
            - CHANGES
         | 
| 123 127 | 
             
            executables: []
         | 
| 128 | 
            +
             | 
| 124 129 | 
             
            extensions: []
         | 
| 130 | 
            +
             | 
| 125 131 | 
             
            requirements: []
         | 
| 126 | 
            -
             | 
| 132 | 
            +
             | 
| 133 | 
            +
            dependencies: []
         | 
| 134 | 
            +
             |