[ warning: investigation is still ongoing, but I thought I'd report this here.]

I'm trying to debug the Ev2 shims over ra_dav.  In doing so, I've
discovered an inconsistency between ra_serf and ra_neon (surprise!)

ra_neon provides a valid argument for the replaced_rev parameter of
the Ev1 delete_entry() function.  The relevant code is in
libsvn_ra_neon/replay.c:

169         const char *path = svn_xml_get_attr_value("name", atts);
170         const char *crev = svn_xml_get_attr_value("rev", atts);
171
172         if (! path)
173           return MISSING_ATTR(nspace, elt_name, "name");
174         else if (! crev)
175           return MISSING_ATTR(nspace, elt_name, "rev");
176         else
177           {
178             dir_item_t *di = &TOP_DIR(rb);
179
180             SVN_ERR(rb->editor->delete_entry(path, SVN_STR_TO_REV(crev),
181                                              di->baton, di->pool));
182           }
183       }
184       break;

Apparently, ra_neon expects and finds a "rev" attribute on the
relevant XML element.  However, the same code in ra_serf (update.c)
doesn't:

1556   else if ((state == OPEN_DIR || state == ADD_DIR) &&
1557            strcmp(name.name, "delete-entry") == 0)
1558     {
1559       const char *file_name;
1560       report_info_t *info;
1561       apr_pool_t *tmppool;
1562       const char *full_path;
1563
1564       file_name = svn_xml_get_attr_value("name", attrs);
1565
1566       if (!file_name)
1567         {
1568           return svn_error_create(
1569             SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
1570             _("Missing name attr in delete-entry element"));
1571         }
1572
1573       info = parser->state->private;
1574
1575       SVN_ERR(open_dir(info->dir));
1576
1577       tmppool = svn_pool_create(info->dir->dir_baton_pool);
1578
1579       full_path = svn_relpath_join(info->dir->name, file_name, tmppool);
1580
1581       SVN_ERR(info->dir->update_editor->delete_entry(full_path,
1582                                                      SVN_INVALID_REVNUM,
1583                                                      info->dir->dir_baton,
1584                                                      tmppool));
1585
1586       svn_pool_destroy(tmppool);
1587     }

As you can see, ra_serf is unconditionally passing SVN_INVALID_REVNUM
to delete_entry(), which is what is causing the shims to fail over
ra_dav (when run with ra_serf).

I tried inserting analogous code to fetch the "rev" attribute in
ra_serf, but it appears that said attribute isn't available.  I'm not
familiar enough with the protocol to know why it would be for ra_neon,
but not ra_serf, and I'm asking here in the hopes that somebody can
enlighten me. :)

-Hyrum

-- 

uberSVN: Apache Subversion Made Easy
http://www.uberSVN.com/

Reply via email to