On Fri, Aug 12, 2011 at 02:56:28AM +0200, Neels J Hofmeyr wrote:
> Hi stsp,
> 
> check this WIP patch out, attached. (I've also appended a wild test script
> that runs all sorts of things. Reading its bottom-most output may suffice.)
> 
> I'd prefer printing the paths relative to the "current working dir" instead
> of relative to the WC root (as this patch does now).
> 
> Say there was an
> [[[
> ~/wc$ svn mv x/alpha a/b/beta
> ]]]
> 
> currently:
> [[[
> ~/wc$ cd a/b/
> ~/wc/a/b$ svn st
> A  +    beta
>    >      moved from x/alpha
> ]]]
> (relative to WC_ROOT)
> 
> rather:
> [[[
> ~/wc/a/b$ svn st
> A  +    beta
>    >      moved from ../../x/alpha
> ]]]
> 
> but I haven't figured out whether there's code that does this already. And,
> to that end, I think those batons should rather pass abspaths (see comments
> in the code).
> 
> What do you say?

Thanks!

How badly does changing this output break "make check"?

See inline comments below.

> 
> ~Neels

> First steps to show moved-to and moved-from in 'svn status'.
> 
> * subversion/include/svn_client.h
> 
> * subversion/include/svn_wc.h
> 
> * subversion/libsvn_client/status.c
>   (svn_client_status_dup): 
>   (svn_client__create_status): 
> 
> * subversion/libsvn_wc/status.c
>   (assemble_status): 
>   (svn_wc_dup_status3): 
> 
> * subversion/svn/status.c
>   (print_status): 
 
> Index: subversion/include/svn_client.h
> ===================================================================
> --- subversion/include/svn_client.h   (revision 1156828)
> +++ subversion/include/svn_client.h   (working copy)
> @@ -2206,6 +2206,18 @@ typedef struct svn_client_status_t
>     * to other data in future versions. */
>    const void *backwards_compatibility_baton;
>  
> +  /** Set to @c true if this file or directory is scheduled for
> +   * addition-with-history that is part of an explicit move operation (or 
> part

I think we should just say "copied" instead of "add-with-history".
It doesn't matter how the copy operation is implemented, it is still a copy.

> +   * of a subtree that is scheduled as such).
> +   */

The boolean variable isn't declared. (Maybe the above comment should
not be here?)

> +  /** Set to the path (relative to the working copy root) that this node was
> +   * moved from, if this file or directory has been moved here locally. */
> +  const char *moved_from_relpath;

As you said, in the APIs we should always use absolute paths.
I used relpaths in svn_wc APIs at one point, giving a bad example,
but they've since been converted to abspaths.

The 'svn' client should perform an abspath->relpath conversion
for display if needed.

> +
> +  /** Set to the path (relative to the working copy root) that this node was
> +   * moved to, if this file or directory has been moved away locally. */
> +  const char *moved_to_relpath;

As above.

> +
>    /* NOTE! Please update svn_client_status_dup() when adding new fields 
> here. */
>  } svn_client_status_t;
>  
> Index: subversion/include/svn_wc.h
> ===================================================================
> --- subversion/include/svn_wc.h       (revision 1156828)
> +++ subversion/include/svn_wc.h       (working copy)
> @@ -3619,6 +3619,14 @@ typedef struct svn_wc_status3_t
>  
>    /** @} */
>  
> +  /* Set to the move source path if this item has been explicitly moved here
> +   * (path relative to the working copy root) */
> +  const char *moved_from_relpath;

Same, please use abspaths.

> +
> +  /* Set to the move destination path if this item has been explicitly moved
> +   * away (path relative to the working copy root) */
> +  const char *moved_to_relpath;
> +
>    /* NOTE! Please update svn_wc_dup_status3() when adding new fields here. */
>  } svn_wc_status3_t;
>  
> Index: subversion/libsvn_client/status.c
> ===================================================================
> --- subversion/libsvn_client/status.c (revision 1156828)
> +++ subversion/libsvn_client/status.c (working copy)
> @@ -563,6 +563,12 @@ svn_client_status_dup(const svn_client_s
>                                                               result_pool);
>      }
>  
> +  if (status->moved_from_relpath)
> +    st->moved_from_relpath = apr_pstrdup(result_pool, 
> status->moved_from_relpath);
> +
> +  if (status->moved_to_relpath)
> +    st->moved_to_relpath = apr_pstrdup(result_pool, 
> status->moved_to_relpath);
> +
>    return st;
>  }
>  
> @@ -667,6 +673,9 @@ svn_client__create_status(svn_client_sta
>          (*cst)->node_status = svn_wc_status_conflicted;
>      }
>  
> +  (*cst)->moved_from_relpath = status->moved_from_relpath;
> +  (*cst)->moved_to_relpath = status->moved_to_relpath;
> +
>    return SVN_NO_ERROR;
>  }
>  
> Index: subversion/libsvn_wc/status.c
> ===================================================================
> --- subversion/libsvn_wc/status.c     (revision 1156828)
> +++ subversion/libsvn_wc/status.c     (working copy)
> @@ -403,6 +403,8 @@ assemble_status(svn_wc_status3_t **statu
>    const char *repos_relpath;
>    const char *repos_root_url;
>    const char *repos_uuid;
> +  const char *moved_from_relpath = NULL;
> +  const char *moved_to_relpath = NULL;
>    svn_filesize_t filesize = (dirent && (dirent->kind == svn_node_file))
>                                  ? dirent->filesize
>                                  : SVN_INVALID_FILESIZE;
> @@ -608,6 +610,42 @@ assemble_status(svn_wc_status3_t **statu
>          }
>      }
>  
> +  /* Get moved_to info. */

"moved-away" (for consistency)

> +  if (info->status == svn_wc__db_status_deleted)
> +    {
> +      const char *moved_to_abspath = NULL;
> +      SVN_ERR(svn_wc__db_scan_deletion(NULL,
> +                                       &moved_to_abspath,
> +                                       NULL, NULL,
> +                                       db, local_abspath,
> +                                       result_pool, scratch_pool));
> +      if (moved_to_abspath)
> +        /* ### This should probably be different, possibly returning a
> +         * ### local_abspath and letting the client construct a pwd-relative
> +         * ### path. */

Yes :)

> +        SVN_ERR(svn_wc__db_to_relpath(&moved_to_relpath, db, local_abspath,
> +                                      moved_to_abspath,
> +                                      result_pool, scratch_pool));
> +
> +    }
> +
> +  /* Get moved_here info. */

"moved-here" (for consistency)

> +  if (info->status == svn_wc__db_status_added)
> +    {

Rest looks fine.

Reply via email to