Here's a patch that fixes half of issue 571. The issue is about
printing out notification that a file has been replaced, rather than
having a notification that it was deleted followed by a notification
that the same file was added. This patch fixes it for commit, and if
people think this is the right approach, I'll do something similar for
update.
-garrett
Index: ./subversion/clients/cmdline/trace-commit.c
===================================================================
--- ./subversion/clients/cmdline/trace-commit.c
+++ ./subversion/clients/cmdline/trace-commit.c Sun Feb 24 20:46:35 2002
@@ -44,6 +44,22 @@
};
+/* When we add and delete files, we don't immediately print out that info,
+ because if a file is both added and deleted, we want to say it was
+ replaced. So instead, we have 2 hashes in the dir baton, one for adds
+ and one for deletes. For deletes, the key is all that matters, since
+ we just need to know the entity's name. For adds, the val is used to
+ tell us if the file was binary or not. (We use the pointer as a flag,
+ it doesn't actually point to anything) We can't just store the value of
+ the file's binary flag, because FALSE is equal to NULL, and that means
+ 'erase this entry' in apr_hash_set. So instead we use this enum. */
+enum file_type
+{
+ binary = 1,
+ text = 2
+};
+
+
struct dir_baton
{
struct edit_baton *edit_baton;
@@ -51,6 +67,8 @@
svn_stringbuf_t *path;
svn_boolean_t added;
svn_boolean_t prop_changed;
+ apr_hash_t *entries_added;
+ apr_hash_t *entries_deleted;
apr_pool_t *subpool;
int ref_count;
};
@@ -80,6 +98,34 @@
if (db->ref_count == 0)
{
struct dir_baton *dbparent = db->parent_dir_baton;
+ apr_hash_index_t *hi;
+ const void *key;
+ void *val;
+
+ for (hi = apr_hash_first(db->subpool, db->entries_added);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ apr_hash_this(hi, &key, NULL, &val);
+ if (apr_hash_get(db->entries_deleted, key, APR_HASH_KEY_STRING)
+ != NULL)
+ {
+ printf("Replacing %s\n", (const char *)key);
+ apr_hash_set(db->entries_deleted, key, APR_HASH_KEY_STRING, NULL);
+ }
+ else
+ printf("Adding %s %s\n",
+ ((enum file_type)val) == binary ? "(bin)" : " ",
+ (const char *)key);
+ }
+
+ for (hi = apr_hash_first(db->subpool, db->entries_deleted);
+ hi;
+ hi = apr_hash_next(hi))
+ {
+ apr_hash_this(hi, &key, NULL, NULL);
+ printf("Deleting %s\n", (const char *)key);
+ }
/* Destroy all memory used by this baton, including the baton
itself! */
@@ -107,6 +153,9 @@
rb->subpool = subpool;
rb->ref_count = 1;
+ rb->entries_added = apr_hash_make(subpool);
+ rb->entries_deleted = apr_hash_make(subpool);
+
*root_baton = rb;
return SVN_NO_ERROR;
@@ -122,7 +171,9 @@
svn_path_add_component (printable_name, name);
- printf ("Deleting %s\n", printable_name->data);
+ apr_hash_set(d->entries_deleted, printable_name->data, APR_HASH_KEY_STRING,
+ printable_name->data);
+
return SVN_NO_ERROR;
}
@@ -150,7 +201,12 @@
child_d->ref_count = 1;
parent_d->ref_count++;
- printf ("Adding %s\n", child_d->path->data);
+ child_d->entries_added = apr_hash_make(subpool);
+ child_d->entries_deleted = apr_hash_make(subpool);
+
+ apr_hash_set(parent_d->entries_added, child_d->path->data,
+ APR_HASH_KEY_STRING, child_d->path->data);
+
*child_baton = child_d;
return SVN_NO_ERROR;
@@ -178,6 +234,9 @@
child_d->ref_count = 1;
parent_d->ref_count++;
+ child_d->entries_added = apr_hash_make(subpool);
+ child_d->entries_deleted = apr_hash_make(subpool);
+
*child_baton = child_d;
/* Don't print anything for a directory open -- this event is
@@ -206,9 +265,9 @@
struct file_baton *fb = file_baton;
if (fb->added)
- printf ("Adding %s %s\n",
- fb->binary ? "(bin)" : " ",
- fb->path->data);
+ apr_hash_set(fb->parent_dir_baton->entries_added, fb->path->data,
+ APR_HASH_KEY_STRING,
+ fb->binary ? (void *)binary : (void *)text);
else
printf ("Sending %s\n", fb->path->data);
--
garrett rooney Unix was not designed to stop you from
rooneg@electricjellyfish.net doing stupid things, because that would
http://electricjellyfish.net/ stop you from doing clever things.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Oct 21 14:37:09 2006