Stefan Sperling <s...@elego.de> writes:

> On Sat, Feb 05, 2011 at 12:55:55PM +0530, Noorul Islam K M wrote:
>
>> Daniel Shahaf <d...@daniel.shahaf.name> writes:
>> >> @@ -363,6 +364,9 @@
>> >>          SVN_ERR(svn_cmdline_printf(pool, _("Copied From Rev: %ld\n"),
>> >>                                     info->copyfrom_rev));
>> >>      }
>> >> +  
>> >> +  if (info->depth == svn_depth_exclude)
>> >> +    SVN_ERR(svn_cmdline_printf(pool, _("Depth: exclude\n")));
>> >>  
>> >
>> > I know that there is already some other place in the code that prints
>> > the Depth: line, why didn't you reuse that place?
>> >
>> 
>> It is inside the if block 'if (info->has_wc_info)'. In our case flow
>> will not reach there so I had to put it here.
>
> 'has_wc_info' is documented as follows:
>
> typedef struct svn_info_t
> {
>
> [...]
>
>   /** Whether or not to ignore the next 10 wc-specific fields. */
>   svn_boolean_t has_wc_info;
>
> And below, we have this group of fields:
>
>   /**
>    * @name Working-copy path fields
>    * These things only apply to a working-copy path.
>    * See svn_wc_entry_t for explanations.
>    * @{
>    */
>   svn_wc_schedule_t schedule;
>   const char *copyfrom_url;
>   svn_revnum_t copyfrom_rev;
>   apr_time_t text_time;
>   apr_time_t prop_time;  /* will always be 0 for svn 1.4 and later */
>   const char *checksum;
>   const char *conflict_old;
>   const char *conflict_new;
>   const char *conflict_wrk;
>   const char *prejfile;
>   /** @since New in 1.5. */
>   const char *changelist;
>   /** @since New in 1.5. */
>   svn_depth_t depth;
>
> There are in fact 12 fields in this group.
> So this comment is probably inaccurate -- the number 10 should now really
> be 12. (We should probably just remove this number from the comment...)
>
> Note that this group of fields includes the 'depth' field.
> So accessing info->depth if has_wc_info is FALSE violates this API.
>
> I think real problem is at the beginning of build_info_for_entry():
>
>   SVN_ERR(svn_wc_read_kind(&kind, wc_ctx, local_abspath, FALSE, pool));
>
>   if (kind == svn_node_none)
>     return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
>                              _("The node '%s' was not found."),
>                              svn_dirent_local_style(local_abspath, pool));
>
> It looks for a path on disk, and if that path isn't there it gives up
> and returns an error. It should consider nodes with depth excluded
> before giving up, though!
> Does that make sense? If you fixed that, so that has_wc_info is TRUE for
> excluded nodes, you could use the existing switch statement in info-cmd.c
> to print the depth value:
>
>         case svn_depth_unknown:
>           /* Unknown depth is the norm for remote directories anyway
>              (although infinity would be equally appropriate).  Let's
>              not bother to print it. */
>           break;
>  
> +        case svn_depth_exclude:
> +          SVN_ERR(svn_cmdline_printf(pool, _("Depth: exclude\n")));
> +          break;
> +
>          case svn_depth_empty:
>            SVN_ERR(svn_cmdline_printf(pool, _("Depth: empty\n")));
>            break;
>
>
>> Index: subversion/libsvn_client/info.c
>> ===================================================================
>> --- subversion/libsvn_client/info.c  (revision 1067395)
>> +++ subversion/libsvn_client/info.c  (working copy)
>> @@ -405,20 +405,30 @@
>
> [...]
>
>>            SVN_ERR(svn_wc__node_get_repos_info(&(info->repos_root_URL),
>> -                                              NULL,
>> +                                              &(info->repos_UUID),
>
> +1 on this change (printing the UUID is good). But you didn't mention
> it in the log message. You should do so, because you are changing the
> behaviour in case the node is a tree-conflict victim. Something like
> "Also, provide the repository UUID in info about tree conflict victims"
> would be sufficient.
>
>>                                                ctx->wc_ctx,
>>                                                local_abspath, FALSE, FALSE,
>>                                                pool, pool));

I modified the code and please find updated patch.

Log
[[[

Fix for issue #3792. Make svn info to display information for
excluded items.

* subversion/include/private/svn_wc_private.h,
  subversion/libsvn_wc/node.c
  (svn_wc__node_depth_is_exclude): New helper function to find
    whether the node is set with depth 'exclude'.

* subversion/libsvn_client/info.c
  (build_info_for_entry): Process node with depth 'exclude' as normal
    one.

* subversion/svn/info-cmd.c
  (print_info): Print depth as 'exclude' for nodes having depth
    exclude.

* subversion/tests/cmdline/depth_tests.py
  (info_excluded): Remove XFail marker.

Patch by: Noorul Islam K M <noorul{_AT_}collab.net>
]]]

Index: subversion/tests/cmdline/depth_tests.py
===================================================================
--- subversion/tests/cmdline/depth_tests.py     (revision 1076511)
+++ subversion/tests/cmdline/depth_tests.py     (working copy)
@@ -2348,8 +2348,6 @@
                                      'mkdir', 'C')
 
 
-# Issue 3792.
-@XFail()
 @Issue(3792)
 def info_excluded(sbox):
   "'info' should treat excluded item as versioned"
Index: subversion/svn/info-cmd.c
===================================================================
--- subversion/svn/info-cmd.c   (revision 1076511)
+++ subversion/svn/info-cmd.c   (working copy)
@@ -344,6 +344,10 @@
           SVN_ERR(svn_cmdline_printf(pool, _("Depth: immediates\n")));
           break;
 
+        case svn_depth_exclude:
+          SVN_ERR(svn_cmdline_printf(pool, _("Depth: exclude\n")));
+          break;
+
         case svn_depth_infinity:
           /* Infinity is the default depth for working copy
              directories.  Let's not print it, it's not special enough
Index: subversion/include/private/svn_wc_private.h
===================================================================
--- subversion/include/private/svn_wc_private.h (revision 1076511)
+++ subversion/include/private/svn_wc_private.h (working copy)
@@ -759,6 +759,16 @@
                          apr_pool_t *result_pool,
                          apr_pool_t *scratch_pool);
 
+/**
+ * Find whether @a local_abspath is set with depth exclude using @a wc_ctx. 
+ */
+svn_error_t *
+svn_wc__node_depth_is_exclude(svn_boolean_t *exclude,
+                              svn_wc_context_t *wc_ctx,
+                              const char *local_abspath,
+                              apr_pool_t *scratch_pool);
+
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
Index: subversion/libsvn_wc/node.c
===================================================================
--- subversion/libsvn_wc/node.c (revision 1076511)
+++ subversion/libsvn_wc/node.c (working copy)
@@ -1528,3 +1528,28 @@
 
   return SVN_NO_ERROR;
 }
+
+svn_error_t *
+svn_wc__node_depth_is_exclude(svn_boolean_t *exclude,
+                              svn_wc_context_t *wc_ctx,
+                              const char *local_abspath,
+                              apr_pool_t *scratch_pool)
+{
+  svn_wc__db_status_t status;
+  svn_error_t *err;
+  
+  *exclude = FALSE;
+
+  err = svn_wc__db_read_info(&status, NULL, NULL, NULL, NULL, NULL, NULL,
+                             NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                             NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+                             NULL, NULL, NULL,
+                             wc_ctx->db, local_abspath, scratch_pool,
+                             scratch_pool);
+
+  if ((! err) && (status == svn_wc__db_status_excluded))
+    *exclude = TRUE;
+
+  return svn_error_return(err);
+}
+
Index: subversion/libsvn_client/info.c
===================================================================
--- subversion/libsvn_client/info.c     (revision 1076511)
+++ subversion/libsvn_client/info.c     (working copy)
@@ -96,13 +96,20 @@
   apr_time_t lock_date;
   const svn_checksum_t *checksum;
   svn_node_kind_t kind;
+  svn_error_t *err;
+  svn_boolean_t exclude = FALSE;
 
   SVN_ERR(svn_wc_read_kind(&kind, wc_ctx, local_abspath, FALSE, pool));
 
   if (kind == svn_node_none)
-    return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
-                             _("The node '%s' was not found."),
-                             svn_dirent_local_style(local_abspath, pool));
+    {
+      svn_error_clear(svn_wc__node_depth_is_exclude(&exclude, wc_ctx,
+                                                    local_abspath, pool));
+      if (! exclude)
+        return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+                                 _("The node '%s' was not found."),
+                                 svn_dirent_local_style(local_abspath, pool));
+    }
 
   tmpinfo = apr_pcalloc(pool, sizeof(*tmpinfo));
   tmpinfo->kind = kind;
@@ -164,9 +171,18 @@
   if (tmpinfo->depth == svn_depth_unknown)
     tmpinfo->depth = svn_depth_infinity;
 
-  SVN_ERR(svn_wc__node_get_schedule(&tmpinfo->schedule, NULL,
-                                    wc_ctx, local_abspath, pool));
+  if (exclude)
+    tmpinfo->depth = svn_depth_exclude;
 
+  err = svn_wc__node_get_schedule(&tmpinfo->schedule, NULL,
+                                  wc_ctx, local_abspath, pool);
+
+  if (err)
+    if (exclude && err->apr_err == SVN_ERR_ENTRY_NOT_FOUND)
+      svn_error_clear(err);
+    else
+      return svn_error_return(err);
+
   SVN_ERR(svn_wc_get_wc_root(&tmpinfo->wcroot_abspath, wc_ctx,
                              local_abspath, pool, pool));
 

Reply via email to