You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Bert Huijben <be...@qqmail.nl> on 2010/03/12 09:31:13 UTC

RE: svn commit: r922176 - in /subversion/trunk/subversion: include/svn_wc.h libsvn_wc/revision_status.c svnversion/main.c


> -----Original Message-----
> From: dannas@apache.org [mailto:dannas@apache.org]
> Sent: vrijdag 12 maart 2010 9:22
> To: commits@subversion.apache.org
> Subject: svn commit: r922176 - in /subversion/trunk/subversion:
> include/svn_wc.h libsvn_wc/revision_status.c svnversion/main.c
> 
> Author: dannas
> Date: Fri Mar 12 08:21:45 2010
> New Revision: 922176
> 
> URL: http://svn.apache.org/viewvc?rev=922176&view=rev
> Log:
> As part of WC-NG, remove some uses of svn_wc_entry_t.
> 
> * subversion/include/svn_wc.h
>   (svn_wc_revision_status2): Add note about us returning
>     SVN_ERR_WC_PATH_NOT_FOUND.
> * subversion/libsvn_wc/revision_status.c
>    (status_baton): Rename this...
>    (walk_baton): .. to this.
>    (analyze_status): Change this to implement svn_wc__node_func_t and use
>      WC-NG funcs instead of information in svn_wc_entry_t.
>    (svn_wc_revision_status2): Use svn_wc__node_walk_children() instead of
>      svn_wc_walk_status() to spare us from the overhead of invoking an
>      editor.
> * subversion/svnversion/main.c
>   (main): Determine if a path is unversioned by checking for
>     SVN_ERR_WC_PATH_NOT_FOUND.
> 
> Approved by: gstein
> 
> Modified:
>     subversion/trunk/subversion/include/svn_wc.h
>     subversion/trunk/subversion/libsvn_wc/revision_status.c
>     subversion/trunk/subversion/svnversion/main.c
> 
> Modified: subversion/trunk/subversion/include/svn_wc.h
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_wc
> .h?rev=922176&r1=922175&r2=922176&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/include/svn_wc.h (original)
> +++ subversion/trunk/subversion/include/svn_wc.h Fri Mar 12 08:21:45 2010
> @@ -7192,7 +7192,8 @@ typedef struct svn_wc_revision_status_t
>  /** Set @a *result_p to point to a new #svn_wc_revision_status_t structure
>   * containing a summary of the revision range and status of the working copy
>   * at @a local_abspath (not including "externals").  @a local_abspath must
> - * be absolute.
> + * be absolute. Return SVN_ERR_WC_PATH_NOT_FOUND if @a
> local_abspath is not
> + * a working copy path.
>   *
>   * Set @a (*result_p)->min_rev and @a (*result_p)->max_rev respectively
> to the
>   * lowest and highest revision numbers in the working copy.  If @a
> committed
> 
> Modified: subversion/trunk/subversion/libsvn_wc/revision_status.c
> URL:
> http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/revis
> ion_status.c?rev=922176&r1=922175&r2=922176&view=diff
> ==========================================================
> ====================
> --- subversion/trunk/subversion/libsvn_wc/revision_status.c (original)
> +++ subversion/trunk/subversion/libsvn_wc/revision_status.c Fri Mar 12
> 08:21:45 2010
> @@ -23,65 +23,100 @@
> 
>  #include "svn_wc.h"
>  #include "svn_dirent_uri.h"
> +#include "wc_db.h"
> +#include "wc.h"
> +#include "props.h"
> 
>  #include "private/svn_wc_private.h"
> 
>  #include "svn_private_config.h"
> 
>  /* A baton for analyze_status(). */
> -struct status_baton
> +struct walk_baton
>  {
>    svn_wc_revision_status_t *result;           /* where to put the result */
>    svn_boolean_t committed;           /* examine last committed revisions */
>    const char *local_abspath;         /* path whose URL we're looking for */
> -  const char *wc_url;    /* URL for the path whose URL we're looking for */
> -  apr_pool_t *pool;         /* pool in which to store alloc-needy things */
> +  svn_wc__db_t *db;
>  };
> 
> -/* An svn_wc_status_func4_t callback function for analyzing status
> -   structures. */
> +/* An svn_wc__node_found_func_t callback function for analyzing the
> status
> + * of nodes */
>  static svn_error_t *
> -analyze_status(void *baton,
> -               const char *local_abspath,
> -               const svn_wc_status2_t *status,
> -               apr_pool_t *pool)
> +analyze_status(const char *local_abspath,
> +               void *baton,
> +               apr_pool_t *scratch_pool)
>  {
> -  struct status_baton *sb = baton;
> +  struct walk_baton *wb = baton;
> +  svn_revnum_t changed_rev;
> +  svn_revnum_t revision;
> +  svn_depth_t depth;
> +  svn_wc__db_status_t status;
> +  svn_boolean_t wc_root;
> +  svn_boolean_t switched;
> +
> +  SVN_ERR(svn_wc__db_read_info(&status, NULL, &revision, NULL,
> +                               NULL, NULL, &changed_rev,
> +                               NULL, NULL, NULL, &depth, NULL, NULL, NULL,
> +                               NULL, NULL, NULL, NULL, NULL, NULL,
> +                               NULL, NULL, NULL, NULL, wb->db,
> +                               local_abspath, scratch_pool, scratch_pool));
> +
> +  /* We need the excluded and absent paths when checking for sparse
> +   * checkouts. But only for that. To collect those we're walking all the
> +   * hidden nodes. */
> +  if (status == svn_wc__db_status_excluded
> +      || status == svn_wc__db_status_absent)
> +    {
> +      wb->result->sparse_checkout = TRUE;
> +      return SVN_NO_ERROR;
> +    }
> 
> -  if (! status->entry)
> +  if (status == svn_wc__db_status_not_present)
>      return SVN_NO_ERROR;
> 
> -  /* Added files have a revision of no interest */
> -  if (status->text_status != svn_wc_status_added)
> +  if (! wb->result->switched)
>      {
> -      svn_revnum_t item_rev = (sb->committed
> -                               ? status->entry->cmt_rev
> -                               : status->entry->revision);
> -
> -      if (sb->result->min_rev == SVN_INVALID_REVNUM
> -          || item_rev < sb->result->min_rev)
> -        sb->result->min_rev = item_rev;
> -
> -      if (sb->result->max_rev == SVN_INVALID_REVNUM
> -          || item_rev > sb->result->max_rev)
> -        sb->result->max_rev = item_rev;
> +      SVN_ERR(svn_wc__check_wc_root(&wc_root, NULL, &switched, wb-
> >db,
> +                                    local_abspath, scratch_pool));
> +
> +      wb->result->switched |= switched;
>      }
> 
> -  if (status->entry->depth != svn_depth_exclude)
> +  /* Added files have a revision of no interest */
> +  if (revision != SVN_INVALID_REVNUM)
>      {
> -      sb->result->switched |= status->switched;
> -      sb->result->modified |= (status->text_status != svn_wc_status_normal);
> -      sb->result->modified |= (status->prop_status != svn_wc_status_normal
> -                               && status->prop_status != svn_wc_status_none);
> +      svn_revnum_t item_rev = (wb->committed
> +                               ? changed_rev
> +                               : revision);
> +
> +      if (wb->result->min_rev == SVN_INVALID_REVNUM
> +          || item_rev < wb->result->min_rev)
> +        wb->result->min_rev = item_rev;
> +
> +      if (wb->result->max_rev == SVN_INVALID_REVNUM
> +          || item_rev > wb->result->max_rev)
> +        wb->result->max_rev = item_rev;
>      }

Added files imply that there is some modification, so you can just set wb->result->modified to TRUE as an else clause.

> -  sb->result->sparse_checkout |= (status->entry->depth !=
> svn_depth_infinity);
> 
> -  if (sb->local_abspath
> -      && (! sb->wc_url)
> -      && (strcmp(local_abspath, sb->local_abspath) == 0)
> -      && (status->entry))
> -    sb->wc_url = apr_pstrdup(sb->pool, status->entry->url);
> +  if (! wb->result->modified)
> +    {
> +      svn_boolean_t text_mod;
> +      svn_boolean_t props_mod;
> 
> +      SVN_ERR(svn_wc__props_modified(&props_mod, wb->db,
> local_abspath,
> +                                     scratch_pool));
> +
> +      SVN_ERR(svn_wc__internal_text_modified_p(&text_mod, wb->db,
> +                                               local_abspath,
> +                                               FALSE,
> +                                               TRUE,
> +                                               scratch_pool));
> +      wb->result->modified |= (text_mod || props_mod);
> +    }

With the risk of over optimizing: no need to perform a text check when you already see a property modification.

Note that '|=' is a bitwise or and '||' is a logical or. I usually recommend not to use both of them in one expression.

But further: nice cleanup :)

	Bert

Re: svn commit: r922176 - in /subversion/trunk/subversion: include/svn_wc.h libsvn_wc/revision_status.c svnversion/main.c

Posted by Greg Stein <gs...@gmail.com>.
On Fri, Mar 12, 2010 at 04:31, Bert Huijben <be...@qqmail.nl> wrote:
>...
>> +++ subversion/trunk/subversion/libsvn_wc/revision_status.c Fri Mar 12
>...
>> +  /* We need the excluded and absent paths when checking for sparse
>> +   * checkouts. But only for that. To collect those we're walking all the
>> +   * hidden nodes. */
>> +  if (status == svn_wc__db_status_excluded
>> +      || status == svn_wc__db_status_absent)
>> +    {
>> +      wb->result->sparse_checkout = TRUE;
>> +      return SVN_NO_ERROR;
>> +    }
>...
>
> Added files imply that there is some modification, so you can just set wb->result->modified to TRUE as an else clause.

That's a very good point. You could set ->modified whenever one of the
following are seen:

* status_added
* status_obstructed_add
* status_deleted
* status_obstructed_delete

>...
>> +  if (! wb->result->modified)
>> +    {
>> +      svn_boolean_t text_mod;
>> +      svn_boolean_t props_mod;
>>
>> +      SVN_ERR(svn_wc__props_modified(&props_mod, wb->db,
>> local_abspath,
>> +                                     scratch_pool));
>> +
>> +      SVN_ERR(svn_wc__internal_text_modified_p(&text_mod, wb->db,
>> +                                               local_abspath,
>> +                                               FALSE,
>> +                                               TRUE,
>> +                                               scratch_pool));
>> +      wb->result->modified |= (text_mod || props_mod);
>> +    }
>
> With the risk of over optimizing: no need to perform a text check when you already see a property modification.

A text compare is *never* over optimizing. We want to avoid that
whenever possible.

And even besides that, there really isn't such a thing as
"over-optimizing" unless/until you obfuscate your source code to gain
a few cycles. That certainly isn't a danger here.

>...

Cheers,
-g