Skip to content

Commit

Permalink
readtags: add -C/--canonicalize-input option
Browse files Browse the repository at this point in the history
Partially close universal-ctags#3168.

TODO:
* revise code,

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
  • Loading branch information
masatake committed Apr 29, 2023
1 parent a67d1ed commit 27a7313
Show file tree
Hide file tree
Showing 10 changed files with 357 additions and 17 deletions.
12 changes: 12 additions & 0 deletions Tmain/readtags-canonicalize-input-names.d/drive-letter0.tags
@@ -0,0 +1,12 @@
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
!_TAG_PROC_CWD C:\tmp //
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_PROGRAM_VERSION 5.9.0 /e08db39a3/
a_fn xyz/a.c /^static void a_fn(void) {}$/;" f typeref:typename:void file:
12 changes: 12 additions & 0 deletions Tmain/readtags-canonicalize-input-names.d/drive-letter1.tags
@@ -0,0 +1,12 @@
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
!_TAG_PROC_CWD D:/tmp //
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_PROGRAM_VERSION 5.9.0 /e08db39a3/
a_fn xyz/a.c /^static void a_fn(void) {}$/;" f typeref:typename:void file:
@@ -0,0 +1 @@
0
34 changes: 34 additions & 0 deletions Tmain/readtags-canonicalize-input-names.d/good0.tags
@@ -0,0 +1,34 @@
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
!_TAG_PROC_CWD /tmp/abc/ //
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_PROGRAM_VERSION 5.9.0 /e08db39a3/
a_fn xyz/a.c /^static void a_fn(void) {}$/;" f typeref:typename:void file:
b_fn b.c /^static void b_fn(void) {}$/;" f typeref:typename:void file:
c_fn ./c.c /^static void c_fn(void) {}$/;" f typeref:typename:void file:
d_fn ./../d.c /^static void d_fn(void) {}$/;" f typeref:typename:void file:
e_fn ../e.c /^static void e_fn(void) {}$/;" f typeref:typename:void file:
f_fn ../../f.c /^static void f_fn(void) {}$/;" f typeref:typename:void file:
g_fn ../../../g.c /^static void g_fn(void) {}$/;" f typeref:typename:void file:
h_fn ../../../../h.c /^static void h_fn(void) {}$/;" f typeref:typename:void file:
i_fn .././../../../i.c /^static void i_fn(void) {}$/;" f typeref:typename:void file:
j_fn .././../j.c /^static void j_fn(void) {}$/;" f typeref:typename:void file:
k_fn .././.././././k.c /^static void k_fn(void) {}$/;" f typeref:typename:void file:
l_fn ././././././l.c /^static void l_fn(void) {}$/;" f typeref:typename:void file:
m_fn ./././../abc/./m.c /^static void m_fn(void) {}$/;" f typeref:typename:void file:
n_fn ./././../abc/X/.././n.c /^static void n_fn(void) {}$/;" f typeref:typename:void file:
o_fn .////.///////./////..//abc//X//..///.///o.c /^static void o_fn(void) {}$/;" f typeref:typename:void file:
p_fn ./../xyz/p.c /^static void p_fn(void) {}$/;" f typeref:typename:void file:
q_fn ./../xyz/../././xyz/q.c /^static void q_fn(void) {}$/;" f typeref:typename:void file:
r_fn /r.c /^static void r_fn(void) {}$/;" f typeref:typename:void file:
s_fn /../s.c /^static void s_fn(void) {}$/;" f typeref:typename:void file:
t_fn /../././t.c /^static void t_fn(void) {}$/;" f typeref:typename:void file:
u_fn /../././tmp/./u.c /^static void u_fn(void) {}$/;" f typeref:typename:void file:
v_fn /../././tmp/./../tmp/abc/./v.c /^static void v_fn(void) {}$/;" f typeref:typename:void file:
w_fn /../././tmp/./../tmp/../abc/./w.c /^static void w_fn(void) {}$/;" f typeref:typename:void file:
34 changes: 34 additions & 0 deletions Tmain/readtags-canonicalize-input-names.d/good1.tags
@@ -0,0 +1,34 @@
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
!_TAG_PROC_CWD /tmp/abc/../././abc/../abc //
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_PROGRAM_VERSION 5.9.0 /e08db39a3/
a_fn xyz/a.c /^static void a_fn(void) {}$/;" f typeref:typename:void file:
b_fn b.c /^static void b_fn(void) {}$/;" f typeref:typename:void file:
c_fn ./c.c /^static void c_fn(void) {}$/;" f typeref:typename:void file:
d_fn ./../d.c /^static void d_fn(void) {}$/;" f typeref:typename:void file:
e_fn ../e.c /^static void e_fn(void) {}$/;" f typeref:typename:void file:
f_fn ../../f.c /^static void f_fn(void) {}$/;" f typeref:typename:void file:
g_fn ../../../g.c /^static void g_fn(void) {}$/;" f typeref:typename:void file:
h_fn ../../../../h.c /^static void h_fn(void) {}$/;" f typeref:typename:void file:
i_fn .././../../../i.c /^static void i_fn(void) {}$/;" f typeref:typename:void file:
j_fn .././../j.c /^static void j_fn(void) {}$/;" f typeref:typename:void file:
k_fn .././.././././k.c /^static void k_fn(void) {}$/;" f typeref:typename:void file:
l_fn ././././././l.c /^static void l_fn(void) {}$/;" f typeref:typename:void file:
m_fn ./././../abc/./m.c /^static void m_fn(void) {}$/;" f typeref:typename:void file:
n_fn ./././../abc/X/.././n.c /^static void n_fn(void) {}$/;" f typeref:typename:void file:
o_fn .////.///////./////..//abc//X//..///.///o.c /^static void o_fn(void) {}$/;" f typeref:typename:void file:
p_fn ./../xyz/p.c /^static void p_fn(void) {}$/;" f typeref:typename:void file:
q_fn ./../xyz/../././xyz/q.c /^static void q_fn(void) {}$/;" f typeref:typename:void file:
r_fn /r.c /^static void r_fn(void) {}$/;" f typeref:typename:void file:
s_fn /../s.c /^static void s_fn(void) {}$/;" f typeref:typename:void file:
t_fn /../././t.c /^static void t_fn(void) {}$/;" f typeref:typename:void file:
u_fn /../././tmp/./u.c /^static void u_fn(void) {}$/;" f typeref:typename:void file:
v_fn /../././tmp/./../tmp/abc/./v.c /^static void v_fn(void) {}$/;" f typeref:typename:void file:
w_fn /../././tmp/./../tmp/../abc/./w.c /^static void w_fn(void) {}$/;" f typeref:typename:void file:
34 changes: 34 additions & 0 deletions Tmain/readtags-canonicalize-input-names.d/good2.tags
@@ -0,0 +1,34 @@
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_OUTPUT_EXCMD mixed /number, pattern, mixed, or combineV2/
!_TAG_OUTPUT_FILESEP slash /slash or backslash/
!_TAG_OUTPUT_MODE u-ctags /u-ctags or e-ctags/
!_TAG_PATTERN_LENGTH_LIMIT 96 /0 for no limit/
!_TAG_PROC_CWD /tmp/abc/../././abc/../abc/ //
!_TAG_PROGRAM_AUTHOR Universal Ctags Team //
!_TAG_PROGRAM_NAME Universal Ctags /Derived from Exuberant Ctags/
!_TAG_PROGRAM_URL https://ctags.io/ /official site/
!_TAG_PROGRAM_VERSION 5.9.0 /e08db39a3/
a_fn xyz/a.c /^static void a_fn(void) {}$/;" f typeref:typename:void file:
b_fn b.c /^static void b_fn(void) {}$/;" f typeref:typename:void file:
c_fn ./c.c /^static void c_fn(void) {}$/;" f typeref:typename:void file:
d_fn ./../d.c /^static void d_fn(void) {}$/;" f typeref:typename:void file:
e_fn ../e.c /^static void e_fn(void) {}$/;" f typeref:typename:void file:
f_fn ../../f.c /^static void f_fn(void) {}$/;" f typeref:typename:void file:
g_fn ../../../g.c /^static void g_fn(void) {}$/;" f typeref:typename:void file:
h_fn ../../../../h.c /^static void h_fn(void) {}$/;" f typeref:typename:void file:
i_fn .././../../../i.c /^static void i_fn(void) {}$/;" f typeref:typename:void file:
j_fn .././../j.c /^static void j_fn(void) {}$/;" f typeref:typename:void file:
k_fn .././.././././k.c /^static void k_fn(void) {}$/;" f typeref:typename:void file:
l_fn ././././././l.c /^static void l_fn(void) {}$/;" f typeref:typename:void file:
m_fn ./././../abc/./m.c /^static void m_fn(void) {}$/;" f typeref:typename:void file:
n_fn ./././../abc/X/.././n.c /^static void n_fn(void) {}$/;" f typeref:typename:void file:
o_fn .////.///////./////..//abc//X//..///.///o.c /^static void o_fn(void) {}$/;" f typeref:typename:void file:
p_fn ./../xyz/p.c /^static void p_fn(void) {}$/;" f typeref:typename:void file:
q_fn ./../xyz/../././xyz/q.c /^static void q_fn(void) {}$/;" f typeref:typename:void file:
r_fn /r.c /^static void r_fn(void) {}$/;" f typeref:typename:void file:
s_fn /../s.c /^static void s_fn(void) {}$/;" f typeref:typename:void file:
t_fn /../././t.c /^static void t_fn(void) {}$/;" f typeref:typename:void file:
u_fn /../././tmp/./u.c /^static void u_fn(void) {}$/;" f typeref:typename:void file:
v_fn /../././tmp/./../tmp/abc/./v.c /^static void v_fn(void) {}$/;" f typeref:typename:void file:
w_fn /../././tmp/./../tmp/../abc/./w.c /^static void w_fn(void) {}$/;" f typeref:typename:void file:
34 changes: 34 additions & 0 deletions Tmain/readtags-canonicalize-input-names.d/run.sh
@@ -0,0 +1,34 @@
#!/bin/sh

# Copyright: 2021 Masatake YAMATO
# License: GPL-2

READTAGS=$3

. ../utils.sh

#V="valgrind --leak-check=full -v"
V=

if ! [ -x "${READTAGS}" ]; then
skip "no readtags"
fi


echo2()
{
echo "$@"
echo "$@" 1>&2
}

run_test()
{
echo2 "# $@"
"${READTAGS}" -F '(list $name "\t" $input "\n")' $2 -t $1 -l
}

run_test good0.tags -C &&
run_test good1.tags --canonicalize-input &&
run_test good2.tags -C &&
! run_test drive-letter0.tags --canonicalize-input &&
! run_test drive-letter1.tags -C
7 changes: 7 additions & 0 deletions Tmain/readtags-canonicalize-input-names.d/stderr-expected.txt
@@ -0,0 +1,7 @@
# good0.tags -C
# good1.tags --canonicalize-input
# good2.tags -C
# drive-letter0.tags --canonicalize-input
!_TAG_PROC_CWD must start with '/': C:\tmp
# drive-letter1.tags -C
!_TAG_PROC_CWD must start with '/': D:/tmp
74 changes: 74 additions & 0 deletions Tmain/readtags-canonicalize-input-names.d/stdout-expected.txt
@@ -0,0 +1,74 @@
# good0.tags -C
a_fn xyz/a.c
b_fn b.c
c_fn c.c
d_fn /tmp/d.c
e_fn /tmp/e.c
f_fn /f.c
g_fn /g.c
h_fn /h.c
i_fn /i.c
j_fn /j.c
k_fn /k.c
l_fn l.c
m_fn m.c
n_fn n.c
o_fn o.c
p_fn /tmp/xyz/p.c
q_fn /tmp/xyz/q.c
r_fn /r.c
s_fn /s.c
t_fn /t.c
u_fn /tmp/u.c
v_fn /tmp/abc/v.c
w_fn /abc/w.c
# good1.tags --canonicalize-input
a_fn xyz/a.c
b_fn b.c
c_fn c.c
d_fn /tmp/d.c
e_fn /tmp/e.c
f_fn /f.c
g_fn /g.c
h_fn /h.c
i_fn /i.c
j_fn /j.c
k_fn /k.c
l_fn l.c
m_fn m.c
n_fn n.c
o_fn o.c
p_fn /tmp/xyz/p.c
q_fn /tmp/xyz/q.c
r_fn /r.c
s_fn /s.c
t_fn /t.c
u_fn /tmp/u.c
v_fn /tmp/abc/v.c
w_fn /abc/w.c
# good2.tags -C
a_fn xyz/a.c
b_fn b.c
c_fn c.c
d_fn /tmp/d.c
e_fn /tmp/e.c
f_fn /f.c
g_fn /g.c
h_fn /h.c
i_fn /i.c
j_fn /j.c
k_fn /k.c
l_fn l.c
m_fn m.c
n_fn n.c
o_fn o.c
p_fn /tmp/xyz/p.c
q_fn /tmp/xyz/q.c
r_fn /r.c
s_fn /s.c
t_fn /t.c
u_fn /tmp/u.c
v_fn /tmp/abc/v.c
w_fn /abc/w.c
# drive-letter0.tags --canonicalize-input
# drive-letter1.tags -C

0 comments on commit 27a7313

Please sign in to comment.