We've already been through why a customizable, format-string keyword
is valuable. Unfortunately, this is post-1.0 because we need a mechanism
for the server to send configuration data to the client. In the meantime,
this patch will provide the concise Id keyword we're used to from CVS, and
provide projects a single place to patch to replace Id with $NetBSD$
or whatever. Not as good as the format-string based keyword, but much
easier than CVS.
I also provide a second patch. IMNSHO, the date used in the keyword
should not be client-customizable. Nor does it need to be as verbose.
The second patch implements a new function to format the date string.
The first patch gives us this:
$Id: bar 146 2002-07-28 16:13:53 -0500 (Sun, 28 Jul 2002) epg $
$Date: 2002-07-28 16:13:53 -0500 (Sun, 28 Jul 2002) $
The second patch gives us this:
$Id: bar 148 2002-07-28 21:30:43 epg $
$Date: 2002-07-28 21:30:43 $
Index: ./subversion/include/svn_types.h
===================================================================
--- ./subversion/include/svn_types.h
+++ ./subversion/include/svn_types.h Sun Jul 28 15:44:00 2002
@@ -318,6 +318,11 @@
#define SVN_KEYWORD_URL_LONG "HeadURL"
#define SVN_KEYWORD_URL_SHORT "URL"
+/* A short combination of the above four keywords. Note that this
+ should go away once the above, more complete solution is
+ implemented. */
+
+#define SVN_KEYWORD_ID "Id"
/*** Shared function types ***/
Index: ./subversion/include/svn_wc.h
===================================================================
--- ./subversion/include/svn_wc.h
+++ ./subversion/include/svn_wc.h Sun Jul 28 15:44:38 2002
@@ -1381,6 +1381,7 @@
const svn_string_t *date;
const svn_string_t *author;
const svn_string_t *url;
+ const svn_string_t *id;
} svn_wc_keywords_t;
Index: ./subversion/libsvn_wc/translate.c
===================================================================
--- ./subversion/libsvn_wc/translate.c
+++ ./subversion/libsvn_wc/translate.c Sun Jul 28 16:07:31 2002
@@ -284,6 +284,15 @@
return TRUE;
}
+ if (keywords->id)
+ {
+ if (translate_keyword_subst (buf, len,
+ SVN_KEYWORD_ID,
+ (sizeof (SVN_KEYWORD_ID)) - 1,
+ expand ? keywords->id : NULL))
+ return TRUE;
+ }
+
/* No translations were successful. Return FALSE. */
return FALSE;
}
@@ -926,6 +935,25 @@
keywords->url = svn_string_create (entry->url, pool);
else
keywords->url = svn_string_create ("", pool);
+ }
+ else if ((! strcmp (keyword, SVN_KEYWORD_ID)))
+ {
+ if (entry && (entry->cmt_rev && entry->cmt_date
+ && entry->cmt_author && entry->url))
+ {
+ char *basename = svn_path_basename (entry->url, pool);
+ svn_string_t *rev = svn_string_createf (pool, "%" SVN_REVNUM_T_FMT,
+ entry->cmt_rev);
+ const char *date = svn_time_to_human_nts (entry->cmt_date, pool);
+
+ keywords->id = svn_string_createf (pool, "%s %s %s %s",
+ basename,
+ rev->data,
+ date,
+ entry->cmt_author);
+ }
+ else
+ keywords->id = svn_string_create ("", pool);
}
else
*is_valid_p = FALSE;
Index: ./subversion/include/svn_types.h
===================================================================
--- ./subversion/include/svn_types.h
+++ ./subversion/include/svn_types.h Sun Jul 28 15:44:00 2002
@@ -318,6 +318,11 @@
#define SVN_KEYWORD_URL_LONG "HeadURL"
#define SVN_KEYWORD_URL_SHORT "URL"
+/* A short combination of the above four keywords. Note that this
+ should go away once the above, more complete solution is
+ implemented. */
+
+#define SVN_KEYWORD_ID "Id"
/*** Shared function types ***/
Index: ./subversion/include/svn_wc.h
===================================================================
--- ./subversion/include/svn_wc.h
+++ ./subversion/include/svn_wc.h Sun Jul 28 15:44:38 2002
@@ -1381,6 +1381,7 @@
const svn_string_t *date;
const svn_string_t *author;
const svn_string_t *url;
+ const svn_string_t *id;
} svn_wc_keywords_t;
Index: ./subversion/libsvn_wc/translate.c
===================================================================
--- ./subversion/libsvn_wc/translate.c
+++ ./subversion/libsvn_wc/translate.c Sun Jul 28 16:25:35 2002
@@ -284,6 +284,15 @@
return TRUE;
}
+ if (keywords->id)
+ {
+ if (translate_keyword_subst (buf, len,
+ SVN_KEYWORD_ID,
+ (sizeof (SVN_KEYWORD_ID)) - 1,
+ expand ? keywords->id : NULL))
+ return TRUE;
+ }
+
/* No translations were successful. Return FALSE. */
return FALSE;
}
@@ -861,6 +870,38 @@
}
+static const char *
+time_to_date_keyword (apr_time_t t, apr_pool_t *pool)
+{
+ const char *t_cstr;
+ apr_time_exp_t exploded_time;
+
+ /* We toss apr_status_t return value here -- for one thing, caller
+ should pass in good information. But also, where APR's own code
+ calls these functions it tosses the return values, and
+ furthermore their current implementations can only return success
+ anyway. */
+
+ /* We get the date in GMT now -- and expect the tm_gmtoff and
+ tm_isdst to be not set. We also ignore the weekday and yearday,
+ since those are not needed. */
+
+ apr_time_exp_gmt (&exploded_time, t);
+
+ /* It would be nice to use apr_strftime(), but APR doesn't give a
+ way to convert back, so we wouldn't be able to share the format
+ string between the writer and reader. */
+ t_cstr = apr_psprintf (pool, "%04d-%02d-%02d %02d:%02d:%02d",
+ exploded_time.tm_year + 1900,
+ exploded_time.tm_mon + 1,
+ exploded_time.tm_mday,
+ exploded_time.tm_hour,
+ exploded_time.tm_min,
+ exploded_time.tm_sec);
+
+ return t_cstr;
+}
+
/* Helper for svn_wc__get_keywords().
If KEYWORD is a valid keyword, look up its value in ENTRY, fill in
@@ -907,7 +948,7 @@
{
if (entry && (entry->cmt_date))
keywords->date = svn_string_create
- (svn_time_to_human_nts (entry->cmt_date, pool), pool);
+ (time_to_date_keyword (entry->cmt_date, pool), pool);
else
keywords->date = svn_string_create ("", pool);
}
@@ -926,6 +967,25 @@
keywords->url = svn_string_create (entry->url, pool);
else
keywords->url = svn_string_create ("", pool);
+ }
+ else if ((! strcmp (keyword, SVN_KEYWORD_ID)))
+ {
+ if (entry && (entry->cmt_rev && entry->cmt_date
+ && entry->cmt_author && entry->url))
+ {
+ char *basename = svn_path_basename (entry->url, pool);
+ svn_string_t *rev = svn_string_createf (pool, "%" SVN_REVNUM_T_FMT,
+ entry->cmt_rev);
+ const char *date = time_to_date_keyword (entry->cmt_date, pool);
+
+ keywords->id = svn_string_createf (pool, "%s %s %s %s",
+ basename,
+ rev->data,
+ date,
+ entry->cmt_author);
+ }
+ else
+ keywords->id = svn_string_create ("", pool);
}
else
*is_valid_p = FALSE;
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sun Jul 28 23:39:07 2002