[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: svn commit: r1103578 - in /subversion/trunk/subversion: include/svn_wc.h libsvn_client/update.c libsvn_wc/deprecated.c libsvn_wc/update_editor.c

From: Daniel Shahaf <d.s_at_daniel.shahaf.name>
Date: Tue, 17 May 2011 09:51:30 +0200

stefan2_at_apache.org wrote on Mon, May 16, 2011 at 00:02:06 -0000:
> Author: stefan2
> Date: Mon May 16 00:02:05 2011
> New Revision: 1103578
>
> URL: http://svn.apache.org/viewvc?rev=1103578&view=rev
> Log:
> Eliminate unnecessary stat calls during checkout, part 1 of 2.
> Most c/o will be to an otherwise empty directory. In that case,
> we don't need to check for obstructions.
>
> * subversion/include/svn_wc.h
> (svn_wc_get_update_editor4): add clean_checkout parameter
> * subversion/libsvn_wc/deprecated.c
> (svn_wc_get_update_editor3): disable optimization for legacy API
>
> * subversion/libsvn_wc/update_editor.c
> (edit_baton): add clean_checkout flag
> (add_file): skip obstruction checks if that flag has been set
> (make_editor): add clean_checkout parameter and pass it on to baton
> (svn_wc_get_update_editor4): pass clean_checkout through to make_editor
> (svn_wc_get_switch_editor4): disable optimization for switch ops
>
> * subversion/libsvn_client/update.c
> (is_empty_wc): new utility function
> (update_internal): detect applicability of "clean c/o" optimization
> and parametrize update_editor accordingly
>
> Modified:
> subversion/trunk/subversion/include/svn_wc.h
> subversion/trunk/subversion/libsvn_client/update.c
> subversion/trunk/subversion/libsvn_wc/deprecated.c
> subversion/trunk/subversion/libsvn_wc/update_editor.c
>
> Modified: subversion/trunk/subversion/include/svn_wc.h
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc.h?rev=1103578&r1=1103577&r2=1103578&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/include/svn_wc.h (original)
> +++ subversion/trunk/subversion/include/svn_wc.h Mon May 16 00:02:05 2011
> @@ -5439,6 +5439,7 @@ svn_wc_get_update_editor4(const svn_delt
> svn_boolean_t allow_unver_obstructions,
> svn_boolean_t adds_as_modification,
> svn_boolean_t server_performs_filtering,
> + svn_boolean_t clean_checkout,
> const char *diff3_cmd,
> const apr_array_header_t *preserved_exts,
> svn_wc_dirents_func_t fetch_dirents_func,
> @@ -5465,8 +5466,8 @@ svn_wc_get_update_editor4(const svn_delt
> * All locks, both those in @a anchor and newly acquired ones, will be
> * released when the editor driver calls @c close_edit.
> *
> - * Always sets @a adds_as_modification to TRUE and @a server_performs_filtering
> - * to FALSE.
> + * Always sets @a adds_as_modification to TRUE, @a server_performs_filtering
> + * and @a clean_checkout to FALSE.
> *
> * Uses a svn_wc_conflict_resolver_func_t conflict resolver instead of a
> * svn_wc_conflict_resolver_func2_t.
>
> Modified: subversion/trunk/subversion/libsvn_client/update.c
> URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/update.c?rev=1103578&r1=1103577&r2=1103578&view=diff
> ==============================================================================
> --- subversion/trunk/subversion/libsvn_client/update.c (original)
> +++ subversion/trunk/subversion/libsvn_client/update.c Mon May 16 00:02:05 2011
> @@ -92,6 +92,59 @@ svn_client__dirent_fetcher(void *baton,
>
> /*** Code. ***/
>
> +/* Set *CLEAN_CHECKOUT to FALSE only if LOCAL_ABSPATH is a non-empty
> + folder. ANCHOR_ABSPATH is the w/c root and LOCAL_ABSPATH will still
> + be considered empty, if it is equal to ANCHOR_ABSPATH and only
> + contains the admin sub-folder.
> + */
> +static svn_error_t *
> +is_empty_wc(const char *local_abspath,
> + const char *anchor_abspath,
> + svn_boolean_t *clean_checkout,
> + apr_pool_t *pool)

Nit: output variables first?

> +{
> + apr_dir_t *dir;
> + apr_finfo_t finfo;
> + svn_error_t *err;
> +
> + /* "clean" until found dirty */
> + *clean_checkout = TRUE;
> +
> + /* open directory. If it does not exist, yet, a clean one will
> + be created by the caller. If it cannot be openend for other
> + reasons, the caller will detect and report those as well.

Nasty side effect. I don't particularly mind how the function handles
error returns from svn_io_dir_open(), but if it does anything other than
SVN_ERR() then that should be documented in the docstring.

> _+ */
> + err = svn_io_dir_open(&dir, local_abspath, pool);
> + if (err)
> + {
> + svn_error_clear(err);
> + return SVN_NO_ERROR;
> + }
> +
> + for (err = svn_io_dir_read(&finfo, APR_FINFO_NAME, dir, pool);
> + err == SVN_NO_ERROR;
> + err = svn_io_dir_read(&finfo, APR_FINFO_NAME, dir, pool))
> + {
> + /* Ignore entries for this dir and its parent, robustly.
> + (APR promises that they'll come first, so technically
> + this guard could be moved outside the loop. But Ryan Bloom
> + says he doesn't believe it, and I believe him. */
> + if (! (finfo.name[0] == '.'
> + && (finfo.name[1] == '\0'
> + || (finfo.name[1] == '.' && finfo.name[2] == '\0'))))
> + {
> + if ( ! svn_wc_is_adm_dir(finfo.name, pool)
> + || strcmp(local_abspath, anchor_abspath) != 0)
> + {
> + *clean_checkout = FALSE;
> + break;
> + }
> + }
> + }
> +
> + svn_error_clear(err);

Why are you ignoring errors from reading the dir's children?

> + return svn_io_dir_close(dir);

I'm not sure you're even allowed to call this if the previous calls
returned an error. (The documentations are silent AFAICT.)
Received on 2011-05-17 08:52:18 CEST

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.