@@ -60,33 +60,81 @@ EXAMPLES:
6060EOF
6161}
6262
63+ # Format file size
64+ format_size () {
65+ local size=" $1 "
66+ if [[ " $size " =~ ^[0-9]+$ ]]; then
67+ if (( size >= 1073741824 )) ; then
68+ echo " $(( size / 1073741824 )) .$(( (size % 1073741824 ) / 107374182 )) GB"
69+ elif (( size >= 1048576 )) ; then
70+ echo " $(( size / 1048576 )) .$(( (size % 1048576 ) / 104857 )) MB"
71+ elif (( size >= 1024 )) ; then
72+ echo " $(( size / 1024 )) .$(( (size % 1024 ) / 102 )) KB"
73+ else
74+ echo " ${size} B"
75+ fi
76+ else
77+ echo " $size "
78+ fi
79+ }
80+
6381# Interactive file selector
6482interactive_file_selector () {
6583 local stage=" $1 "
6684 local dsn=" $2 "
6785
6886 echo " Fetching file list from stage @${stage} ..."
6987
70- # Get file list
71- local file_list
72- file_list =$( bendsql --dsn " ${dsn} " --query=" list @${stage} ;" 2> /dev/null | awk ' {print $1} ' | grep -E ' \.(tar\.gz|tgz)$ ' | sort )
88+ # Get raw output from list command
89+ local raw_output
90+ raw_output =$( bendsql --dsn " ${dsn} " --query=" list @${stage} ;" 2> /dev/null)
7391
74- if [[ -z " $file_list " ]]; then
75- log_error " No .tar.gz files found in stage @${stage} "
92+ if [[ -z " $raw_output " ]]; then
93+ log_error " Failed to get file list from stage @${stage} "
7694 return 1
7795 fi
7896
79- # Convert to array
97+ # Parse files and sizes
8098 local files=()
99+ local sizes=()
100+ local file_list=" "
101+
102+ # Process each line to extract filename and size
81103 while IFS= read -r line; do
82- [[ -n " $line " ]] && files+=(" $line " )
83- done <<< " $file_list"
104+ # Skip empty lines and headers
105+ [[ -z " $line " ]] && continue
106+ [[ " $line " =~ ^[[:space:]]* name ]] && continue
107+ [[ " $line " =~ ^[[:space:]]* -+ ]] && continue
108+
109+ # Extract filename (first field) and size (second field)
110+ local filename=$( echo " $line " | awk ' {print $1}' )
111+ local size=$( echo " $line " | awk ' {print $2}' )
112+
113+ # Only include tar.gz files
114+ if [[ " $filename " =~ \. (tar\. gz| tgz)$ ]]; then
115+ files+=(" $filename " )
116+ sizes+=(" $( format_size " $size " ) " )
117+ fi
118+ done <<< " $raw_output"
84119
85120 if [[ ${# files[@]} -eq 0 ]]; then
86121 log_error " No .tar.gz files found in stage @${stage} "
87122 return 1
88123 fi
89124
125+ # Sort files (and corresponding sizes)
126+ local sorted_files=()
127+ local sorted_sizes=()
128+ local indices=($( for i in " ${! files[@]} " ; do echo " $i :${files[$i]} " ; done | sort -t: -k2 | cut -d: -f1) )
129+
130+ for i in " ${indices[@]} " ; do
131+ sorted_files+=(" ${files[$i]} " )
132+ sorted_sizes+=(" ${sizes[$i]} " )
133+ done
134+
135+ files=(" ${sorted_files[@]} " )
136+ sizes=(" ${sorted_sizes[@]} " )
137+
90138 # Default to last file
91139 local selected=$(( ${# files[@]} - 1 ))
92140 local total=${# files[@]}
@@ -96,24 +144,36 @@ interactive_file_selector() {
96144 echo " Use ↑/↓ or k/j to navigate, Enter to select, q to quit"
97145 echo " "
98146
147+ # Calculate max filename length for alignment
148+ local max_name_len=0
149+ for filename in " ${files[@]} " ; do
150+ if [[ ${# filename} -gt $max_name_len ]]; then
151+ max_name_len=${# filename}
152+ fi
153+ done
154+ max_name_len=$(( max_name_len + 2 ))
155+
99156 # Display function
100157 display_files () {
101158 # Clear screen and move to top
102159 echo -ne " \033[2J\033[H"
103160 echo " Stage: @${stage} ($total files)"
104161 echo " Use ↑/↓ or k/j to navigate, Enter to select, q to quit"
105162 echo " "
163+ printf " %-${max_name_len} s %s\n" " Filename" " Size"
164+ printf " %-${max_name_len} s %s\n" " $( printf ' %*s' $(( max_name_len- 1 )) ' ' | tr ' ' ' -' ) " " ----"
106165
107166 for i in " ${! files[@]} " ; do
167+ local display_line=" $( printf " %-${max_name_len} s %s" " ${files[$i]} " " ${sizes[$i]} " ) "
108168 if [[ $i -eq $selected ]]; then
109- echo -e " \033[7m> ${files[$i]} \033[0m" # Highlighted
169+ echo -e " \033[7m> $display_line \033[0m" # Highlighted
110170 else
111- echo " ${files[$i]} "
171+ echo " $display_line "
112172 fi
113173 done
114174
115175 echo " "
116- echo " Selected: ${files[$selected]} "
176+ echo " Selected: ${files[$selected]} ( ${sizes[$selected]} ) "
117177 }
118178
119179 # Initial display
@@ -148,7 +208,7 @@ interactive_file_selector() {
148208 ;;
149209 ' ' ) # Enter
150210 echo " "
151- echo " Selected: ${files[$selected]} "
211+ echo " Selected: ${files[$selected]} ( ${sizes[$selected]} ) "
152212 SELECTED_FILE=" ${files[$selected]} "
153213 return 0
154214 ;;
0 commit comments