anchor.diff:                ENDWHILE.
   
                 IF <ls_result>-obj_type IS INITIAL.
  -                lv_object = '<td rowspan="' && lv_span && '">&nbsp;</td>'.
  +                lv_object = '<td rowspan="' && lv_span && '">&nbsp;</td>' &&
  +                  '<td rowspan="' && lv_span && '"></td>'.
                   lv_trclass = ' class="unsupported"'.
                 ELSE.
                   CLEAR lv_trclass.
                   lv_object = '<td rowspan="' && lv_span && '">' &&
                     jump_link( iv_obj_type = <ls_result>-obj_type
                                iv_obj_name = <ls_result>-obj_name ) &&
  +                  '</td>' &&
  +                  '<td rowspan="' && lv_span && '">' &&
  +                  <ls_result>-package &&
                     '</td>'.
                 ENDIF.
               ELSE.
  
positive.code:     ls_object-type = gc_type-commit.
      ls_object-data = lv_commit.
      APPEND ls_object TO lt_objects.
      CLEAR ls_object.
      ls_object-sha1 = lcl_hash=>sha1( iv_type = gc_type-tree iv_data = lv_tree ).
      ls_object-type = gc_type-tree.
      ls_object-data = lv_tree.
      APPEND ls_object TO lt_objects.
      LOOP AT it_files ASSIGNING <ls_file>.
        CLEAR ls_object.
        ls_object-sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = <ls_file>-data ).
        ls_object-type = gc_type-blob.
        ls_object-data = <ls_file>-data.
        APPEND ls_object TO lt_objects.
      ENDLOOP.
  
  
negative.code: 
    METHOD push.
  
      DATA: lt_expanded TYPE ty_expanded_tt,
            lt_blobs    TYPE ty_files_tt,
            lv_sha1     TYPE ty_sha1,
            lt_trees    TYPE ty_trees_tt,
            lt_stage    TYPE lcl_stage=>ty_stage_tt.
  
      FIELD-SYMBOLS: <ls_stage> LIKE LINE OF lt_stage,
                     <ls_exp>   LIKE LINE OF lt_expanded.
  
  
      lt_expanded = full_tree( it_objects = io_repo->get_objects( )
                               iv_branch  = io_repo->get_sha1_remote( ) ).
  
      lt_stage = io_stage->get_all( ).
      LOOP AT lt_stage ASSIGNING <ls_stage>.
        CASE <ls_stage>-method.
          WHEN lcl_stage=>c_method-add.
            APPEND <ls_stage>-file TO lt_blobs.
  
            READ TABLE lt_expanded ASSIGNING <ls_exp> WITH KEY
              name = <ls_stage>-file-filename
              path = <ls_stage>-file-path.
            IF sy-subrc <> 0. " new files
              APPEND INITIAL LINE TO lt_expanded ASSIGNING <ls_exp>.
              <ls_exp>-name = <ls_stage>-file-filename.
              <ls_exp>-path = <ls_stage>-file-path.
            ENDIF.
  
            lv_sha1 = lcl_hash=>sha1( iv_type = gc_type-blob iv_data = <ls_stage>-file-data ).
            IF <ls_exp>-sha1 <> lv_sha1.
              <ls_exp>-sha1 = lv_sha1.
            ENDIF.
          WHEN lcl_stage=>c_method-rm.
            DELETE lt_expanded
              WHERE name = <ls_stage>-file-filename
              AND path = <ls_stage>-file-path.
            ASSERT sy-subrc = 0.
          WHEN OTHERS.
            _raise 'stage method not supported, todo'.
        ENDCASE.
      ENDLOOP.
  
      lt_trees = build_trees( lt_expanded ).
  
      rv_branch = receive_pack( is_comment = is_comment
                                io_repo    = io_repo
                                it_trees   = lt_trees
                                it_blobs   = lt_blobs
                                iv_branch  = io_repo->get_sha1_remote( ) ).
  
    ENDMETHOD.                    "push
  
    METHOD walk_tree.
  
      DATA: ls_object   LIKE LINE OF it_objects,
            lt_expanded LIKE rt_expanded,
            lt_nodes    TYPE lcl_git_pack=>ty_nodes_tt.
  
      FIELD-SYMBOLS: <ls_exp>  LIKE LINE OF rt_expanded,
                     <ls_node> LIKE LINE OF lt_nodes.
  
  
      READ TABLE it_objects INTO ls_object
        WITH KEY sha1 = iv_tree
        type = gc_type-tree.
      IF sy-subrc <> 0.
        _raise 'tree not found'.
      ENDIF.
      lt_nodes = lcl_git_pack=>decode_tree( ls_object-data ).
  
      LOOP AT lt_nodes ASSIGNING <ls_node>.
        CASE <ls_node>-chmod.
          WHEN gc_chmod-file.
            APPEND INITIAL LINE TO rt_expanded ASSIGNING <ls_exp>.
            <ls_exp>-path = iv_base.
            <ls_exp>-name = <ls_node>-name.
            <ls_exp>-sha1 = <ls_node>-sha1.
          WHEN gc_chmod-dir.
            lt_expanded = walk_tree(
              it_objects = it_objects
              iv_tree    = <ls_node>-sha1
              iv_base    = iv_base && <ls_node>-name && '/' ).
            APPEND LINES OF lt_expanded TO rt_expanded.
          WHEN OTHERS.
            _raise 'walk_tree: unknown chmod'.
        ENDCASE.
      ENDLOOP.
  
    ENDMETHOD.
  
    METHOD full_tree.
  
      DATA: ls_object LIKE LINE OF it_objects,
            ls_commit TYPE lcl_git_pack=>ty_commit.
  