1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-11-08 10:13:18 +01:00
git/builtin
Jiang Xin ad66df2df1 quote.c: substitute path_relative with relative_path
Substitute the function path_relative in quote.c with the function
relative_path. Function relative_path can be treated as an enhanced
and more robust version of path_relative.

Outputs of path_relative and it's replacement (relative_path) are the
same for the following cases:

    path      prefix     output of path_relative  output of relative_path
    ========  =========  =======================  =======================
    /a/b/c/   /a/b/      c/                       c/
    /a/b/c    /a/b/      c                        c
    /a/       /a/b/      ../                      ../
    /         /a/b/      ../../                   ../../
    /a/c      /a/b/      ../c                     ../c
    /x/y      /a/b/      ../../x/y                ../../x/y
    a/b/c/    a/b/       c/                       c/
    a/        a/b/       ../                      ../
    x/y       a/b/       ../../x/y                ../../x/y
    /a/b      (empty)    /a/b                     /a/b
    /a/b      (null)     /a/b                     /a/b
    a/b       (empty)    a/b                      a/b
    a/b       (null)     a/b                      a/b

But if both of the path and the prefix are the same, or the returned
relative path should be the current directory, the outputs of both
functions are different. Function relative_path returns "./", while
function path_relative returns empty string.

    path      prefix     output of path_relative  output of relative_path
    ========  =========  =======================  =======================
    /a/b/     /a/b/      (empty)                  ./
    a/b/      a/b/       (empty)                  ./
    (empty)   (null)     (empty)                  ./
    (empty)   (empty)    (empty)                  ./

But the callers of path_relative can handle such cases, or never
encounter this issue at all, because:

 * In function quote_path_relative, if the output of path_relative is
   empty, append "./" to it, like:

       if (!out->len)
           strbuf_addstr(out, "./");

 * Another caller is write_name_quoted_relative, which is only used
   by builtin/ls-files.c. git-ls-files only show files, so path of
   files will never be identical with the prefix of a directory.

The following differences show that path_relative does not handle
extra slashes properly:

    path      prefix     output of path_relative  output of relative_path
    ========  =========  =======================  =======================
    /a//b//c/ //a/b//    ../../../../a//b//c/     c/
    a/b//c    a//b       ../b//c                  c

And if prefix has no trailing slash, path_relative does not work
properly either.  But since prefix always has a trailing slash, it's
not a problem.

    path      prefix     output of path_relative  output of relative_path
    ========  =========  =======================  =======================
    /a/b/c/   /a/b       b/c/                     c/
    /a/b      /a/b       b                        ./
    /a/b/     /a/b       b/                       ./
    /a        /a/b/      ../../a                  ../
    a/b/c/    a/b        b/c/                     c/
    a/b/      a/b        b/                       ./
    a         a/b        ../a                     ../
    x/y       a/b/       ../x/y                   ../../x/y
    a/c       a/b        c                        ../c
    /a/       /a/b       (empty)                  ../
    (empty)   /a/b       ../../                   ./

One tricky part in this conversion is write_name() function in
ls-files.c.  It takes a counted string, <name, len>, that is to be
made relative to <prefix, prefix_len> and then quoted.  Because
write_name_quoted_relative() still takes these two parameters as
counted string, but ignores the count and treat these two as
NUL-terminated strings, this conversion needs to be audited for its
callers:

 - For <name, len>, all three callers of write_name() passes a
   NUL-terminated string and its true length, so this patch makes
   "len" unused.

 - For <prefix, prefix_len>, prefix could be a string that is longer
   than empty while prefix_len could be 0 when "--full-name" option
   is used.  This is fixed by checking prefix_len in write_name()
   and calling write_name_quoted_relative() with NULL when
   prefix_len is set to 0.  Again, this makes "prefix_len" given to
   write_name_quoted_relative() unused, without introducing a bug.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-06-26 11:13:50 -07:00
..
add.c Merge branch 'jc/add-ignore-removal' 2013-04-26 15:28:09 -07:00
annotate.c
apply.c Merge branch 'jc/apply-ws-fix-tab-in-indent' into maint 2013-04-22 11:26:56 -07:00
archive.c pkt-line: provide a LARGE_PACKET_MAX static buffer 2013-02-20 13:42:22 -08:00
bisect--helper.c
blame.c Merge branch 'nd/pretty-formats' 2013-04-23 11:22:48 -07:00
branch.c branch: colour upstream branches 2013-04-15 11:04:44 -07:00
bundle.c
cat-file.c cat-file: print tags raw for "cat-file -p" 2013-04-17 14:48:45 -07:00
check-attr.c
check-ignore.c dir.c: git-status --ignored: don't scan the work tree twice 2013-04-15 12:36:42 -07:00
check-ref-format.c
checkout-index.c
checkout.c Merge branch 'nd/checkout-keep-sparse' 2013-04-22 11:11:40 -07:00
clean.c Merge branch 'as/check-ignore' 2013-01-23 21:19:10 -08:00
clone.c Merge branch 'jk/check-corrupt-objects-carefully' 2013-04-28 11:57:54 -07:00
column.c
commit-tree.c commit-tree: document -S option consistently 2013-03-25 15:01:22 -07:00
commit.c pretty: save commit encoding from logmsg_reencode if the caller needs it 2013-04-18 16:28:27 -07:00
config.c Merge branch 'cn/config-missing-path' into maint 2012-11-25 18:35:46 -08:00
count-objects.c count-objects: add -H option to humanize sizes 2013-04-10 13:27:26 -07:00
credential.c
describe.c Merge branch 'jc/describe' into maint 2013-04-03 09:25:52 -07:00
diff-files.c
diff-index.c
diff-tree.c
diff.c Merge branch 'kb/preload-index-more' 2012-11-20 10:32:10 -08:00
fast-export.c fast-export: add --signed-tags=warn-strip mode 2013-04-15 09:02:25 -07:00
fetch-pack.c Merge branch 'jk/pkt-line-cleanup' 2013-04-01 08:59:37 -07:00
fetch.c Merge branch 'jk/gc-auto-after-fetch' 2013-02-01 12:40:16 -08:00
fmt-merge-msg.c Merge branch 'rt/commentchar-fmt-merge-msg' 2013-04-15 12:40:56 -07:00
for-each-ref.c
fsck.c
gc.c
grep.c Sync with 1.8.1 maintenance track 2013-04-03 09:18:01 -07:00
hash-object.c
help.c help: mark common_guides[] as translatable 2013-04-12 09:49:00 -07:00
index-pack.c Merge branch 'nd/index-pack-threaded-fixes' into maint 2013-04-04 13:00:41 -07:00
init-db.c
log.c Merge branch 'rr/shortlog-doc' 2013-04-26 15:28:39 -07:00
ls-files.c quote.c: substitute path_relative with relative_path 2013-06-26 11:13:50 -07:00
ls-remote.c
ls-tree.c pathspec: save the non-wildcard length part 2012-11-19 13:08:28 -08:00
mailinfo.c Merge branch 'jc/same-encoding' into maint 2012-12-07 14:10:56 -08:00
mailsplit.c mailsplit: sort maildir filenames more cleverly 2013-03-02 22:52:44 -08:00
merge-base.c
merge-file.c
merge-index.c Which merge_file() function do you mean? 2012-12-09 23:05:27 -08:00
merge-ours.c
merge-recursive.c
merge-tree.c merge-tree: handle directory/empty conflict correctly 2013-05-06 22:17:00 -07:00
merge.c Merge branch 'jc/merge-tag-object' into maint 2013-04-24 16:14:06 -07:00
mktag.c
mktree.c
mv.c
name-rev.c
notes.c Allow custom "comment char" 2013-01-16 12:48:22 -08:00
pack-objects.c
pack-redundant.c Fix sizeof usage in get_permutations 2012-12-13 11:13:44 -08:00
pack-refs.c
patch-id.c
prune-packed.c
prune.c Merge branch 'jk/fully-peeled-packed-ref' into maint-1.8.1 2013-04-03 08:43:03 -07:00
push.c remote.c: introduce a way to have different remotes for fetch/push 2013-04-02 10:41:42 -07:00
read-tree.c
receive-pack.c Merge branch 'jk/receive-pack-deadlocks-with-early-failure' 2013-04-23 11:16:50 -07:00
reflog.c Merge branch 'jc/maint-reflog-expire-clean-mark-typofix' into maint 2013-03-26 12:39:51 -07:00
remote-ext.c
remote-fd.c
remote.c remote: check for superfluous arguments in 'git remote add' 2013-04-24 13:12:51 -07:00
replace.c
rerere.c
reset.c reset: update documentation to require only tree-ish with paths 2013-01-16 12:50:23 -08:00
rev-list.c
rev-parse.c
revert.c cherry-pick/revert: make usage say '<commit-ish>...' 2013-04-24 09:48:01 -07:00
rm.c rm: do not complain about d/f conflicts during deletion 2013-04-04 12:28:47 -07:00
send-pack.c teach get_remote_heads to read from a memory buffer 2013-02-24 00:17:38 -08:00
shortlog.c builtin/shortlog.c: make usage string consistent with log 2013-04-22 08:00:54 -07:00
show-branch.c show-branch: use strbuf instead of static buffer 2013-04-06 18:57:15 -07:00
show-ref.c
stripspace.c Allow custom "comment char" 2013-01-16 12:48:22 -08:00
symbolic-ref.c
tag.c Merge branch 'ph/tag-force-no-warn-on-creation' into maint 2013-04-03 09:24:51 -07:00
tar-tree.c
unpack-file.c
unpack-objects.c
update-index.c update-index: allow "-h" to also display options 2013-02-23 23:49:33 -08:00
update-ref.c
update-server-info.c
upload-archive.c pkt-line: provide a LARGE_PACKET_MAX static buffer 2013-02-20 13:42:22 -08:00
var.c
verify-pack.c
verify-tag.c gpg_interface: allow to request status return 2013-02-14 09:30:04 -08:00
write-tree.c