Some drivers have multiple doc files sharing one code directory
(e.g., igb, igc, e1000 variants). Others have doc files for VF/DCF
variants (e.g., ice_dcf, ixgbe_vf).

Extend driver_code_dir() to strip variant suffixes and map driver
names to their shared code directories.

Build a cache mapping each code directory to its associated doc
files. Add docs_for_code() to retrieve all doc names for a given
code directory.

Add items_not_in() to compute set difference between two lists.
Use it in check_rte_flow() to compare doc vs code items:
- items documented but not in code are always reported,
- items in code but not documented in any doc for the code
  directory are reported, avoiding false positives when multiple
  docs share the same code.

Also rename doc files to match their code directory names.

Signed-off-by: David Marchand <[email protected]>
---
Changes since v2:
- introduced logic earlier in the series,
- added comments and implemented for rte_flow checks,

---
 MAINTAINERS                                   |   2 +-
 devtools/check-doc-vs-code.sh                 | 109 +++++++++++++++---
 .../features/{afpacket.ini => af_packet.ini}  |   2 +-
 .../features/{cxgbevf.ini => cxgbe_vf.ini}    |   2 +-
 4 files changed, 98 insertions(+), 17 deletions(-)
 rename doc/guides/nics/features/{afpacket.ini => af_packet.ini} (70%)
 rename doc/guides/nics/features/{cxgbevf.ini => cxgbe_vf.ini} (90%)

diff --git a/MAINTAINERS b/MAINTAINERS
index 1720cff62e..e05bea2f0c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -679,7 +679,7 @@ F: examples/bond/
 Linux AF_PACKET
 M: Stephen Hemminger <[email protected]>
 F: drivers/net/af_packet/
-F: doc/guides/nics/features/afpacket.ini
+F: doc/guides/nics/features/af_packet.ini
 F: app/test/test_pmd_af_packet.c
 
 Linux AF_XDP
diff --git a/devtools/check-doc-vs-code.sh b/devtools/check-doc-vs-code.sh
index e141fe9938..7afc18d153 100755
--- a/devtools/check-doc-vs-code.sh
+++ b/devtools/check-doc-vs-code.sh
@@ -36,35 +36,86 @@ has_file_change() # <pattern>
        changed_files | grep -q "$1"
 }
 
+net_driver_from_path() # <path>
+{
+       sed -rn '
+               s,.*drivers/net/intel/([^/]*)/.*,\1,p; t
+               s,.*drivers/net/([^./]*)/.*,\1,p; t
+               s,.*doc/guides/nics/features/([^./]*).*,\1,p' |
+       grep -v '^default$'
+}
+
 changed_net_drivers()
 {
        [ -n "$drivers" ] ||
                drivers=$(changed_files |
-                       sed -rn '
-                               s,^drivers/net/intel/([^/]*).*,\1,p; t
-                               s,^drivers/net/([^/]*).*,\1,p; t
-                               s,^doc/guides/nics/features/([^.]*).*,\1,p' |
+                       net_driver_from_path |
                        sort -u)
        echo "$drivers"
 }
 
 all_net_drivers()
 {
-       find $rootdir/drivers/net -name meson.build |
-       sed -rn '
-               s,.*drivers/net/intel/([^/]*).*,\1,p; t
-               s,.*drivers/net/([^/]*).*,\1,p' |
+       {
+               find $rootdir/drivers/net -name meson.build
+               ls $rootdir/doc/guides/nics/features/*.ini
+       } |
+       net_driver_from_path |
        sort -u
 }
 
 # give back a driver directory for a doc/driver name
 driver_code_dir() # <driver_name>
 {
-       if [ -d $rootdir/drivers/net/intel/$1 ]; then
-               echo "$rootdir/drivers/net/intel/$1"
-       else
-               echo "$rootdir/drivers/net/$1"
-       fi
+       drv=$(echo "$1" | sed -r 's/_(dcf|vec|vf)$//')
+       case $drv in
+       enetc|enetc4)
+               echo "$rootdir/drivers/net/enetc" ;;
+       igb|igc|e1000)
+               echo "$rootdir/drivers/net/intel/e1000" ;;
+       *)
+               if [ -d $rootdir/drivers/net/intel/$drv ]; then
+                       echo "$rootdir/drivers/net/intel/$drv"
+               else
+                       echo "$rootdir/drivers/net/$drv"
+               fi ;;
+       esac
+}
+
+# create a cache of the mapping between a driver code directory and associated 
driver docs
+# format of this cache is:
+# ^,$drv1_directory: $drv1_doc_name1 $drv1_doc_name2,$drv2_directory: 
$drv2_doc_name1,...,$
+doc_code_map=","
+for d in $rootdir/doc/guides/nics/features/*.ini; do
+       drv=$(basename "$d" .ini)
+       [ "$drv" != 'default' ] || continue
+       code=$(driver_code_dir $drv)
+       case $doc_code_map in
+       *,$code:*)
+               before=${doc_code_map%,$code:*}
+               after=${doc_code_map#*,$code:}
+               drvs=${after%%,*}
+               rest=${after#*,}
+               doc_code_map="$before,$code:$drvs $drv,$rest" ;;
+       *)
+               doc_code_map="$doc_code_map$code: $drv," ;;
+       esac
+done
+
+# extract all doc names from the cache created above
+docs_for_code() # <code_dir>
+{
+       tmp=${doc_code_map#*,$1:}
+       echo ${tmp%%,*}
+}
+
+# output items from first list that are not in second list
+items_not_in() # <list1> <list2>
+{
+       {
+               [ -n "$1" ] && echo "$1"
+               [ -n "$2" ] && { echo "$2"; echo "$2"; }
+       } | sort | uniq -u
 }
 
 check_rte_flow() # <driver>
@@ -73,7 +124,37 @@ check_rte_flow() # <driver>
        doc=$rootdir/doc/guides/nics/features/$1.ini
        [ -d $code ] || return 0
        [ -f $doc ] || return 0
-       report=$($selfdir/parse-flow-support.sh $code $doc)
+       code_support=$($selfdir/parse-flow-support.sh $code)
+       report=$(
+               for category in item action; do
+                       section="rte_flow ${category}s]"
+                       code_items=$(echo "$code_support" | sed -n 
"/$section/,/]/p" |
+                               sed '/]/d' |        # ignore section title
+                               sed 's, *=.*,,' |   # keep only item name
+                               sed '/^$/d' |       # remove empty lines
+                               sort -u)
+                       doc_items=$(sed -n "/$section/,/]/p" "$doc" |
+                               sed '/]/d' |        # ignore section title
+                               sed 's, *=.*,,' |   # keep only item name
+                               sed '/^$/d' |       # remove empty lines
+                               sort -u)
+                       {
+                               # items documented but not in code
+                               items_not_in "$doc_items" "$code_items"
+                               # items in code but not documented in any doc 
for the code directory
+                               all_doc_items=$(
+                                       for drv in $(docs_for_code $code); do
+                                               
d=$rootdir/doc/guides/nics/features/$drv.ini
+                                               sed -n "/$section/,/]/p" "$d" |
+                                                       sed '/]/d' |        # 
ignore section title
+                                                       sed 's, *=.*,,' |   # 
keep only item name
+                                                       sed '/^$/d'         # 
remove empty lines
+                                       done | sort -u
+                               )
+                               items_not_in "$code_items" "$all_doc_items"
+                       } | sed "s,^,$category ,"   # prefix with category name
+               done
+       )
        if [ -n "$report" ]; then
                error "rte_flow doc out of sync for $1"
                echo "$report" | sed 's,^,\t,'
diff --git a/doc/guides/nics/features/afpacket.ini 
b/doc/guides/nics/features/af_packet.ini
similarity index 70%
rename from doc/guides/nics/features/afpacket.ini
rename to doc/guides/nics/features/af_packet.ini
index bc669dfb8a..b1cbc54aca 100644
--- a/doc/guides/nics/features/afpacket.ini
+++ b/doc/guides/nics/features/af_packet.ini
@@ -1,5 +1,5 @@
 ;
-; Supported features of the 'afpacket' network poll mode driver.
+; Supported features of the 'af_packet' network poll mode driver.
 ;
 ; Refer to default.ini for the full list of available PMD features.
 ;
diff --git a/doc/guides/nics/features/cxgbevf.ini 
b/doc/guides/nics/features/cxgbe_vf.ini
similarity index 90%
rename from doc/guides/nics/features/cxgbevf.ini
rename to doc/guides/nics/features/cxgbe_vf.ini
index a921cda6b1..b77b202272 100644
--- a/doc/guides/nics/features/cxgbevf.ini
+++ b/doc/guides/nics/features/cxgbe_vf.ini
@@ -1,5 +1,5 @@
 ;
-; Supported features of the 'cxgbevf' network poll mode driver.
+; Supported features of the 'cxgbe_vf' network poll mode driver.
 ;
 ; Refer to default.ini for the full list of available PMD features.
 ;
-- 
2.54.0

Reply via email to