Skip to content

Instantly share code, notes, and snippets.

@LouisBrunner
Created November 18, 2015 14:22
Show Gist options
  • Save LouisBrunner/2b0497100a0a39fbaf2d to your computer and use it in GitHub Desktop.
Save LouisBrunner/2b0497100a0a39fbaf2d to your computer and use it in GitHub Desktop.
Add a mtime value for files in mod_dav_svn (subversion 1.6.17)
Index: subversion/mod_dav_svn/repos.c
===================================================================
--- subversion/mod_dav_svn/repos.c (revision 1712076)
+++ subversion/mod_dav_svn/repos.c (working copy)
@@ -2758,7 +2758,7 @@
bytes"), but many browsers have grown to expect "text/plain"
to mean "*shrug*", and kick off their own MIME type detection
routines when they see it. So we'll use "text/plain".
-
+
### Why not just avoid sending a Content-type at all? Is
### that just bad form for HTTP? */
if (! mimetype)
@@ -2879,10 +2879,12 @@
" <!ELEMENT updir EMPTY>\n"
" <!ELEMENT file EMPTY>\n"
" <!ATTLIST file name CDATA #REQUIRED\n"
- " href CDATA #REQUIRED>\n"
+ " href CDATA #REQUIRED\n"
+ " mtime CDATA #REQUIRED>\n"
" <!ELEMENT dir EMPTY>\n"
" <!ATTLIST dir name CDATA #REQUIRED\n"
- " href CDATA #REQUIRED>\n"
+ " href CDATA #REQUIRED\n"
+ " mtime CDATA #REQUIRED>\n"
"]>\n";
/* <svn version="1.3.0 (dev-build)"
@@ -3044,6 +3046,9 @@
const char *href = name;
svn_boolean_t is_dir = (entry->kind == svn_node_dir);
const char *repos_relpath = NULL;
+ char *mtime = "1970-01-01";
+ svn_error_t* err;
+ svn_dirent_t* dirent;
svn_pool_clear(entry_pool);
@@ -3092,6 +3097,20 @@
href = ap_os_escape_path(entry_pool, href, 0);
href = apr_xml_quote_string(entry_pool, href, 1);
+ if (repos_relpath != NULL && !(err = svn_repos_stat(&dirent, resource->info->root.root, repos_relpath, entry_pool)))
+ {
+ if (dirent != NULL)
+ {
+#define EIP_MTIME_FORMAT_SIZE 255
+ apr_size_t result;
+ apr_time_exp_t tm;
+
+ apr_time_exp_lt(&tm, dirent->time);
+ mtime = apr_palloc(entry_pool, (EIP_MTIME_FORMAT_SIZE) * sizeof(*mtime));
+ apr_strftime(mtime, &result, EIP_MTIME_FORMAT_SIZE, "%A, %d %B %Y - %T %Z (UTC %z)", &tm);
+ }
+ }
+
if (gen_html)
{
/* If our directory was access using the public peg-rev
@@ -3100,14 +3119,14 @@
if (resource->info->pegged)
{
ap_fprintf(output, bb,
- " <li><a href=\"%s?p=%ld\">%s</a></li>\n",
- href, resource->info->root.rev, name);
+ " <li><a href=\"%s?p=%ld\">%s</a> (%s)</li>\n",
+ href, resource->info->root.rev, name, mtime);
}
else
{
ap_fprintf(output, bb,
- " <li><a href=\"%s\">%s</a></li>\n",
- href, name);
+ " <li><a href=\"%s\">%s</a> (%s)</li>\n",
+ href, name, mtime);
}
}
else
@@ -3122,14 +3141,14 @@
if (resource->info->pegged)
{
ap_fprintf(output, bb,
- " <%s name=\"%s\" href=\"%s?p=%ld\" />\n",
- tag, name, href, resource->info->root.rev);
+ " <%s name=\"%s\" href=\"%s?p=%ld\" mtime=\"%s\" />\n",
+ tag, name, href, resource->info->root.rev, mtime);
}
else
{
ap_fprintf(output, bb,
- " <%s name=\"%s\" href=\"%s\" />\n",
- tag, name, href);
+ " <%s name=\"%s\" href=\"%s\" mtime=\"%s\" />\n",
+ tag, name, href, mtime);
}
}
}
@@ -3772,7 +3791,7 @@
if (params->walk_type & DAV_WALKTYPE_AUTH)
{
const char *repos_relpath =
- apr_pstrcat(iterpool,
+ apr_pstrcat(iterpool,
apr_pstrmemdup(iterpool,
ctx->repos_path->data,
ctx->repos_path->len),
@@ -3821,7 +3840,7 @@
ctx->uri->len = uri_len;
ctx->repos_path->len = repos_len;
}
-
+
svn_pool_destroy(iterpool);
return NULL;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment