git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Michael Haggerty <mhagger@alum.mit.edu>
To: Jiang Xin <worldhello.net@gmail.com>
Cc: Junio C Hamano <gitster@pobox.com>, Git List <git@vger.kernel.org>
Subject: Re: [PATCH v13 02/15] path.c: refactor relative_path(), not only strip prefix
Date: Wed, 22 May 2013 10:06:57 +0200	[thread overview]
Message-ID: <519C7CA1.2060402@alum.mit.edu> (raw)
In-Reply-To: <d730f00edb09449bf299be8d2083c895a1028c18.1369186574.git.worldhello.net@gmail.com>

Sorry for coming late to the party.

On 05/22/2013 03:40 AM, Jiang Xin wrote:
> Original design of relative_path() is simple, just strip the prefix
> (*base) from the absolute path (*abs). In most cases, we need a real
> relative path, such as: ../foo, ../../bar. That's why there is another
> reimplementation (path_relative()) in quote.c.
> 
> Refactor relative_path() in path.c to return real relative path, so
> that user can reuse this function without reimplement his/her own.
> I will use this method for interactive git-clean later. Some of the
> implementations are borrowed from path_relative() in quote.c.
> 
> Different results for relative_path() before and after this refactor:
> 
>     abs path  base path  relative (original)  relative (refactor)
>     ========  =========  ===================  ===================
>     /a/b/c/   /a/b       c/                   c/
>     /a/b//c/  //a///b/   c/                   c/
>     /a/b      /a/b       .                    ./
>     /a/b/     /a/b       .                    ./
>     /a        /a/b/      /a                   ../
>     /         /a/b/      /                    ../../
>     /a/c      /a/b/      /a/c                 ../c
>     /a/b      (empty)    /a/b                 /a/b
>     /a/b      (null)     /a/b                 /a/b
>     (empty)   /a/b       (empty)              ./
>     (null)    (empty)    (null)               ./
>     (null)    /a/b       (segfault)           ./

The old and new versions both seem to be (differently) inconsistent
about when the output has a trailing slash.  What is the rule?

> diff --git a/path.c b/path.c
> index 04ff..0174d 100644
> --- a/path.c
> +++ b/path.c
> @@ -441,42 +441,104 @@ int adjust_shared_perm(const char *path)
>  	return 0;
>  }
>  
> -const char *relative_path(const char *abs, const char *base)
> +/*
> + * Give path as relative to prefix.
> + *
> + * The strbuf may or may not be used, so do not assume it contains the
> + * returned path.
> + */
> +const char *relative_path(const char *abs, const char *base,
> +			  struct strbuf *sb)

Thanks for adding documentation.  But I think it could be improved:

* The comment refers to "path" and "prefix" but the function parameters
are "abs" and "base".  I suggest making them agree.

* Who owns the memory pointed to by the return value?

* The comment says that "the strbuf may or may not be used".  So why is
it part of the interface?  (I suppose it is because the strbuf might be
given ownership of the returned memory if it has to be allocated.)
Would it be more straightforward to *always* return the result in the
strbuf?

* Please document when the return value contains a trailing slash and
also that superfluous internal slashes are (apparently) normalized away.

* Leading double-slashes have a special meaning on some operating
systems.  The old and new versions of this function both seem to ignore
differences between initial slashes.  Perhaps somebody who knows the
rules better could say whether this is an issue but I guess the problem
would rarely be encountered in practice.

Michael

-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/

  reply	other threads:[~2013-05-22  8:07 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-05-17  9:20 [PATCH v11 00/15] *** Interactive git-clean *** Jiang Xin
2013-05-17  9:20 ` [PATCH v11 01/15] path.c: refactor relative_path(), not only strip prefix Jiang Xin
2013-05-17  9:20 ` [PATCH v11 02/15] test: test relative_path through test-path-utils Jiang Xin
2013-05-17  9:20 ` [PATCH v11 03/15] quote.c: remove path_relative, use relative_path instead Jiang Xin
2013-05-17  9:20 ` [PATCH v11 04/15] Refactor quote_path_relative, remove unused params Jiang Xin
2013-05-17  9:20 ` [PATCH v11 05/15] Refactor write_name_quoted_relative, " Jiang Xin
2013-05-17  9:20 ` [PATCH v11 06/15] git-clean: refactor git-clean into two phases Jiang Xin
2013-05-17  9:20 ` [PATCH v11 07/15] git-clean: add support for -i/--interactive Jiang Xin
2013-05-17  9:20 ` [PATCH v11 08/15] git-clean: show items of del_list in columns Jiang Xin
2013-05-17  9:20 ` [PATCH v11 09/15] git-clean: add colors to interactive git-clean Jiang Xin
2013-05-17  9:20 ` [PATCH v11 10/15] git-clean: use a git-add-interactive compatible UI Jiang Xin
2013-05-17  9:20 ` [PATCH v11 11/15] git-clean: add filter by pattern interactive action Jiang Xin
2013-05-17  9:20 ` [PATCH v11 12/15] git-clean: add select by numbers " Jiang Xin
2013-05-17  9:20 ` [PATCH v11 13/15] git-clean: add ask each " Jiang Xin
2013-05-17  9:20 ` [PATCH v11 14/15] git-clean: add documentation for interactive git-clean Jiang Xin
2013-05-17  9:20 ` [PATCH v11 15/15] test: add t7301 for git-clean--interactive Jiang Xin
2013-05-18  3:18 ` [PATCH v12 00/15] Interactive git-clean Jiang Xin
2013-05-20 22:48   ` Junio C Hamano
2013-05-18  3:18 ` [PATCH v12 01/15] test: add test cases for relative_path Jiang Xin
2013-05-21 20:37   ` Junio C Hamano
2013-05-22  1:40     ` [PATCH v13 00/15] interactive git-clean Jiang Xin
2013-05-22  1:40     ` [PATCH v13 01/15] test: add test cases for relative_path Jiang Xin
2013-05-22  1:40     ` [PATCH v13 02/15] path.c: refactor relative_path(), not only strip prefix Jiang Xin
2013-05-22  8:06       ` Michael Haggerty [this message]
2013-05-22 16:23         ` Junio C Hamano
2013-05-26  0:21         ` Jiang Xin
2013-05-30  6:56           ` Jiang Xin
2013-05-22  1:40     ` [PATCH v13 03/15] quote.c: remove path_relative, use relative_path instead Jiang Xin
2013-05-22  1:40     ` [PATCH v13 04/15] Refactor quote_path_relative, remove unused params Jiang Xin
2013-05-22  1:40     ` [PATCH v13 05/15] Refactor write_name_quoted_relative, " Jiang Xin
2013-05-22  1:40     ` [PATCH v13 06/15] git-clean: refactor git-clean into two phases Jiang Xin
2013-05-22  1:40     ` [PATCH v13 07/15] git-clean: add support for -i/--interactive Jiang Xin
2013-05-22  1:40     ` [PATCH v13 08/15] git-clean: show items of del_list in columns Jiang Xin
2013-05-22  1:40     ` [PATCH v13 09/15] git-clean: add colors to interactive git-clean Jiang Xin
2013-05-22  1:40     ` [PATCH v13 10/15] git-clean: use a git-add-interactive compatible UI Jiang Xin
2013-05-22  1:40     ` [PATCH v13 11/15] git-clean: add filter by pattern interactive action Jiang Xin
2013-05-22  1:40     ` [PATCH v13 12/15] git-clean: add select by numbers " Jiang Xin
2013-05-22  1:40     ` [PATCH v13 13/15] git-clean: add ask each " Jiang Xin
2013-05-22  1:40     ` [PATCH v13 14/15] git-clean: add documentation for interactive git-clean Jiang Xin
2013-05-22  1:40     ` [PATCH v13 15/15] test: add t7301 for git-clean--interactive Jiang Xin
2013-05-18  3:18 ` [PATCH v12 02/15] path.c: refactor relative_path(), not only strip prefix Jiang Xin
2013-05-18  3:18 ` [PATCH v12 03/15] quote.c: remove path_relative, use relative_path instead Jiang Xin
2013-05-18  3:18 ` [PATCH v12 04/15] Refactor quote_path_relative, remove unused params Jiang Xin
2013-05-18  3:18 ` [PATCH v12 05/15] Refactor write_name_quoted_relative, " Jiang Xin
2013-05-18  3:18 ` [PATCH v12 06/15] git-clean: refactor git-clean into two phases Jiang Xin
2013-05-18  3:18 ` [PATCH v12 07/15] git-clean: add support for -i/--interactive Jiang Xin
2013-05-18  3:19 ` [PATCH v12 08/15] git-clean: show items of del_list in columns Jiang Xin
2013-05-18  3:19 ` [PATCH v12 09/15] git-clean: add colors to interactive git-clean Jiang Xin
2013-05-18  3:19 ` [PATCH v12 10/15] git-clean: use a git-add-interactive compatible UI Jiang Xin
2013-05-18  3:19 ` [PATCH v12 11/15] git-clean: add filter by pattern interactive action Jiang Xin
2013-05-18  3:19 ` [PATCH v12 12/15] git-clean: add select by numbers " Jiang Xin
2013-05-18  3:19 ` [PATCH v12 13/15] git-clean: add ask each " Jiang Xin
2013-05-18  3:19 ` [PATCH v12 14/15] git-clean: add documentation for interactive git-clean Jiang Xin
2013-05-18  3:19 ` [PATCH v12 15/15] test: add t7301 for git-clean--interactive Jiang Xin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=519C7CA1.2060402@alum.mit.edu \
    --to=mhagger@alum.mit.edu \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=worldhello.net@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).