Alien-SVN

 view release on metacpan or  search on metacpan

src/subversion/subversion/bindings/swig/ruby/svn/delta.rb  view on Meta::CPAN

      end
    end

    class ChangedDirsEditor < BaseEditor
      attr_reader :changed_dirs

      def initialize
        @changed_dirs = []
      end

      def open_root(base_revision)
        [true, '']
      end

      def delete_entry(path, revision, parent_baton)
        dir_changed(parent_baton)
      end

      def add_directory(path, parent_baton,
                        copyfrom_path, copyfrom_revision)
        dir_changed(parent_baton)
        [true, path]
      end

      def open_directory(path, parent_baton, base_revision)
        [true, path]
      end

      def change_dir_prop(dir_baton, name, value)
        dir_changed(dir_baton)
      end

      def add_file(path, parent_baton,
                   copyfrom_path, copyfrom_revision)
        dir_changed(parent_baton)
      end

      def open_file(path, parent_baton, base_revision)
        dir_changed(parent_baton)
      end

      def close_edit(baton)
        @changed_dirs.sort!
      end

      private
      def dir_changed(baton)
        if baton[0]
          # the directory hasn't been printed yet. do it.
          @changed_dirs << "#{baton[1]}/"
          baton[0] = nil
        end
      end
    end

    class ChangedEditor < BaseEditor

      attr_reader :copied_files, :copied_dirs
      attr_reader :added_files, :added_dirs
      attr_reader :deleted_files, :deleted_dirs
      attr_reader :updated_files, :updated_dirs

      def initialize(root, base_root)
        @root = root
        @base_root = base_root
        @in_copied_dir = []
        @copied_files = []
        @copied_dirs = []
        @added_files = []
        @added_dirs = []
        @deleted_files = []
        @deleted_dirs = []
        @updated_files = []
        @updated_dirs = []
      end

      def open_root(base_revision)
        [true, '']
      end

      def delete_entry(path, revision, parent_baton)
        if @base_root.dir?("/#{path}")
          @deleted_dirs << "#{path}/"
        else
          @deleted_files << path
        end
      end

      def add_directory(path, parent_baton,
                        copyfrom_path, copyfrom_revision)
        copyfrom_rev, copyfrom_path = @root.copied_from(path)
        if in_copied_dir?
          @in_copied_dir.push(true)
        elsif Util.copy?(copyfrom_path, copyfrom_rev)
          @copied_dirs << ["#{path}/", "#{copyfrom_path.sub(/^\//, '')}/", copyfrom_rev]
          @in_copied_dir.push(true)
        else
          @added_dirs << "#{path}/"
          @in_copied_dir.push(false)
        end
        [false, path]
      end

      def open_directory(path, parent_baton, base_revision)
        [true, path]
      end

      def change_dir_prop(dir_baton, name, value)
        if dir_baton[0]
          @updated_dirs << "#{dir_baton[1]}/"
          dir_baton[0] = false
        end
        dir_baton
      end

      def close_directory(dir_baton)
        unless dir_baton[0]
          @in_copied_dir.pop
        end
      end

      def add_file(path, parent_baton,
                   copyfrom_path, copyfrom_revision)
        copyfrom_rev, copyfrom_path = @root.copied_from(path)
        if in_copied_dir?
          # do nothing
        elsif Util.copy?(copyfrom_path, copyfrom_rev)
          @copied_files << [path, copyfrom_path.sub(/^\//, ''), copyfrom_rev]
        else
          @added_files << path
        end
        [nil, nil, nil]
      end

      def open_file(path, parent_baton, base_revision)
        [nil, nil, path]
      end

      def apply_textdelta(file_baton, base_checksum)
        file_baton[0] = :update
        nil
      end

      def change_file_prop(file_baton, name, value)
        file_baton[1] = :update
      end

      def close_file(file_baton, text_checksum)
        text_mod, prop_mod, path = file_baton
        # test the path. it will be nil if we added this file.
        if path
          if [text_mod, prop_mod] != [nil, nil]
            @updated_files << path
          end
        end
      end

      def close_edit(baton)
        @copied_files.sort! {|a, b| a[0] <=> b[0]}
        @copied_dirs.sort! {|a, b| a[0] <=> b[0]}
        @added_files.sort!
        @added_dirs.sort!
        @deleted_files.sort!
        @deleted_dirs.sort!
        @updated_files.sort!
        @updated_dirs.sort!
      end

      private
      def in_copied_dir?
        @in_copied_dir.last
      end
    end

    class WrapEditor
      extend Forwardable

      def_delegators :@wrapped_editor, :set_target_revision, :open_root
      def_delegators :@wrapped_editor, :delete_entry, :add_directory
      def_delegators :@wrapped_editor, :open_directory, :change_dir_prop
      def_delegators :@wrapped_editor, :close_directory, :absent_directory
      def_delegators :@wrapped_editor, :add_file, :open_file, :apply_textdelta
      def_delegators :@wrapped_editor, :change_file_prop, :close_file
      def_delegators :@wrapped_editor, :absent_file, :close_edit, :abort_edit

      def initialize(wrapped_editor)
        @wrapped_editor = wrapped_editor
      end
    end
  end
end



( run in 0.324 second using v1.01-cache-2.11-cpan-5623c5533a1 )