@@ -52,6 +52,12 @@ validate_board() {
5252 validate_debug_level_menu " $board_name " " $boards_file "
5353 echo " "
5454
55+ # Rule 6: Check for duplicate lines
56+ echo " Rule 6: Duplicate Lines Validation"
57+ echo " =================================="
58+ validate_no_duplicates " $board_name " " $boards_file "
59+ echo " "
60+
5561 # Add more validation rules here as needed
5662 echo " =========================================="
5763 print_success " ALL VALIDATION RULES PASSED for board '$board_name '"
@@ -112,6 +118,7 @@ validate_required_properties() {
112118 echo " ✓ Required properties validation completed"
113119}
114120
121+
115122# Rule 3: Check for valid partition schemes for available flash sizes
116123validate_partition_schemes () {
117124 local board_name=" $1 "
@@ -352,16 +359,29 @@ validate_vid_pid_consistency() {
352359 local board_name=" $1 "
353360 local boards_file=" $2 "
354361
355- # Get all VID and PID entries for this board
362+ # Get all VID and PID entries for this board (including upload_port entries)
356363 local vid_entries
357364 local pid_entries
358365
359366 vid_entries=$( grep " ^$board_name \.vid\." " $boards_file " | sort)
360367 pid_entries=$( grep " ^$board_name \.pid\." " $boards_file " | sort)
361368
369+ # Also get upload_port VID and PID entries
370+ local upload_port_vid_entries
371+ local upload_port_pid_entries
372+
373+ upload_port_vid_entries=$( grep " ^$board_name \.upload_port\..*\.vid=" " $boards_file " | sort)
374+ upload_port_pid_entries=$( grep " ^$board_name \.upload_port\..*\.pid=" " $boards_file " | sort)
375+
362376 # Check for duplicate VID entries with same index but different values
377+ local all_vid_entries=" $vid_entries "
378+ if [ -n " $upload_port_vid_entries " ]; then
379+ all_vid_entries=" $all_vid_entries
380+ $upload_port_vid_entries "
381+ fi
382+
363383 local vid_duplicates
364- vid_duplicates=$( echo " $vid_entries " | cut -d' =' -f1 | sort | uniq -d)
384+ vid_duplicates=$( echo " $all_vid_entries " | cut -d' =' -f1 | sort | uniq -d)
365385
366386 if [ -n " $vid_duplicates " ]; then
367387 print_error " Found duplicate VID entries with different values for board '$board_name ':"
@@ -370,8 +390,14 @@ validate_vid_pid_consistency() {
370390 fi
371391
372392 # Check for duplicate PID entries with same index but different values
393+ local all_pid_entries=" $pid_entries "
394+ if [ -n " $upload_port_pid_entries " ]; then
395+ all_pid_entries=" $all_pid_entries
396+ $upload_port_pid_entries "
397+ fi
398+
373399 local pid_duplicates
374- pid_duplicates=$( echo " $pid_entries " | cut -d' =' -f1 | sort | uniq -d)
400+ pid_duplicates=$( echo " $all_pid_entries " | cut -d' =' -f1 | sort | uniq -d)
375401
376402 if [ -n " $pid_duplicates " ]; then
377403 print_error " Found duplicate PID entries with different values for board '$board_name ':"
@@ -383,8 +409,26 @@ validate_vid_pid_consistency() {
383409 local vid_indices
384410 local pid_indices
385411
386- vid_indices=$( echo " $vid_entries " | cut -d' =' -f1 | sed " s/^$board_name \.vid\.//" | sort -n)
387- pid_indices=$( echo " $pid_entries " | cut -d' =' -f1 | sed " s/^$board_name \.pid\.//" | sort -n)
412+ # Get indices from regular vid/pid entries
413+ local regular_vid_indices=$( echo " $vid_entries " | cut -d' =' -f1 | sed " s/^$board_name \.vid\.//" | sort -n)
414+ local regular_pid_indices=$( echo " $pid_entries " | cut -d' =' -f1 | sed " s/^$board_name \.pid\.//" | sort -n)
415+
416+ # Get indices from upload_port entries
417+ local upload_vid_indices=$( echo " $upload_port_vid_entries " | cut -d' =' -f1 | sed " s/^$board_name \.upload_port\.//" | sed " s/\.vid$//" | sort -n)
418+ local upload_pid_indices=$( echo " $upload_port_pid_entries " | cut -d' =' -f1 | sed " s/^$board_name \.upload_port\.//" | sed " s/\.pid$//" | sort -n)
419+
420+ # Combine indices
421+ vid_indices=" $regular_vid_indices "
422+ if [ -n " $upload_vid_indices " ]; then
423+ vid_indices=" $vid_indices
424+ $upload_vid_indices "
425+ fi
426+
427+ pid_indices=" $regular_pid_indices "
428+ if [ -n " $upload_pid_indices " ]; then
429+ pid_indices=" $pid_indices
430+ $upload_pid_indices "
431+ fi
388432
389433 # Check if VID and PID indices match
390434 if [ " $vid_indices " != " $pid_indices " ]; then
@@ -394,6 +438,48 @@ validate_vid_pid_consistency() {
394438 exit 1
395439 fi
396440
441+ # Check that no VID/PID combination matches esp32_family (0x303a/0x1001)
442+ local esp32_family_vid=" 0x303a"
443+ local esp32_family_pid=" 0x1001"
444+
445+ # Check regular vid/pid entries
446+ if [ -n " $vid_entries " ] && [ -n " $pid_entries " ]; then
447+ while IFS= read -r vid_line; do
448+ if [ -n " $vid_line " ]; then
449+ local vid_index=$( echo " $vid_line " | cut -d' =' -f1 | sed " s/^$board_name \.vid\.//" )
450+ local vid_value=$( echo " $vid_line " | cut -d' =' -f2)
451+
452+ # Find corresponding PID
453+ local pid_value
454+ pid_value=$( grep " ^$board_name \.pid\.$vid_index =" " $boards_file " | cut -d' =' -f2)
455+
456+ if [ " $vid_value " = " $esp32_family_vid " ] && [ " $pid_value " = " $esp32_family_pid " ]; then
457+ print_error " Board '$board_name ' VID/PID combination ($vid_value /$pid_value ) matches esp32_family VID/PID (0x303a/0x1001) - this is not allowed"
458+ exit 1
459+ fi
460+ fi
461+ done <<< " $vid_entries"
462+ fi
463+
464+ # Check upload_port vid/pid entries
465+ if [ -n " $upload_port_vid_entries " ] && [ -n " $upload_port_pid_entries " ]; then
466+ while IFS= read -r vid_line; do
467+ if [ -n " $vid_line " ]; then
468+ local vid_index=$( echo " $vid_line " | cut -d' =' -f1 | sed " s/^$board_name \.upload_port\.//" | sed " s/\.vid$//" )
469+ local vid_value=$( echo " $vid_line " | cut -d' =' -f2)
470+
471+ # Find corresponding PID
472+ local pid_value
473+ pid_value=$( grep " ^$board_name \.upload_port\.$vid_index \.pid=" " $boards_file " | cut -d' =' -f2)
474+
475+ if [ " $vid_value " = " $esp32_family_vid " ] && [ " $pid_value " = " $esp32_family_pid " ]; then
476+ print_error " Board '$board_name ' upload_port VID/PID combination ($vid_value /$pid_value ) matches esp32_family VID/PID (0x303a/0x1001) - this is not allowed"
477+ exit 1
478+ fi
479+ fi
480+ done <<< " $upload_port_vid_entries"
481+ fi
482+
397483 echo " ✓ VID and PID consistency check passed"
398484}
399485
@@ -445,6 +531,46 @@ validate_debug_level_menu() {
445531 echo " ✓ DebugLevel menu validation completed"
446532}
447533
534+ # Rule 6: Check for duplicate lines
535+ validate_no_duplicates () {
536+ local board_name=" $1 "
537+ local boards_file=" $2 "
538+
539+ # Get all lines for this board
540+ local board_lines
541+ board_lines=$( grep " ^$board_name \." " $boards_file " )
542+
543+ # Extract just the property names (before =)
544+ local property_names
545+ property_names=$( echo " $board_lines " | cut -d' =' -f1)
546+
547+ # Find duplicates
548+ local duplicate_lines
549+ duplicate_lines=$( echo " $property_names " | sort | uniq -d)
550+
551+ if [ -n " $duplicate_lines " ]; then
552+ print_error " Found duplicate lines for board '$board_name ':"
553+ echo " Duplicate line keys:"
554+ echo " $duplicate_lines "
555+
556+ echo " Duplicate content details:"
557+ while IFS= read -r line_key; do
558+ if [ -n " $line_key " ]; then
559+ echo " Key: $line_key "
560+ echo " Content with line numbers:"
561+ local key_only=$( echo " $line_key " | cut -d' =' -f1)
562+ grep -n " ^$key_only =" " $boards_file " | while IFS=' :' read -r line_num full_line; do
563+ echo " Line $line_num : $full_line "
564+ done
565+ echo " "
566+ fi
567+ done <<< " $duplicate_lines"
568+ exit 1
569+ fi
570+
571+ echo " ✓ No duplicate lines found"
572+ }
573+
448574# Main execution
449575main () {
450576 if [ $# -ne 1 ]; then
0 commit comments