11from __future__ import annotations
22
33from io import BufferedWriter
4- from typing import TypedDict
4+ from typing import TypedDict , Generator
55import os
66from re import compile , IGNORECASE
77
8+ from click ._termui_impl import ProgressBar
89from click_extra import echo , progressbar
910from rich import print as rprint
1011from rich .tree import Tree
@@ -116,21 +117,21 @@ def run_listing(
116117
117118
118119def get_directory_items (
120+ bar : ProgressBar [str ],
119121 tps : GeoCom ,
120122 device : str ,
121123 directory : str ,
122124 depth : int = 0
123125) -> list [FileTreeItem ]:
124126 if depth == 0 :
125127 return []
126-
128+ bar . update ( 1 , directory )
127129 resp_setup = tps .ftr .setup_listing (
128130 _DEVICE [device ],
129131 File .UNKNOWN ,
130132 f"{ directory } /*"
131133 )
132134 if resp_setup .error != GeoComCode .OK :
133- # tps.ftr.abort_list()
134135 return []
135136
136137 resp_list = tps .ftr .list ()
@@ -151,8 +152,6 @@ def get_directory_items(
151152 "children" : []
152153 }
153154 )
154- count = 1
155-
156155 while not last :
157156 resp_list = tps .ftr .list (True )
158157 if resp_list .error != GeoComCode .OK or resp_list .params is None :
@@ -167,11 +166,11 @@ def get_directory_items(
167166 "children" : []
168167 }
169168 )
170- count += 1
171169
172170 tps .ftr .abort_list ()
173171 for item in output :
174172 item ["children" ] = get_directory_items (
173+ bar ,
175174 tps ,
176175 device ,
177176 f"{ directory } /{ item ['name' ]} " ,
@@ -218,7 +217,6 @@ def build_file_tree(
218217 tree : FileTreeItem ,
219218 branch : Tree | None = None
220219) -> Tree :
221-
222220 if branch is None :
223221 branch = Tree (format_tree_item (tree ))
224222
@@ -229,22 +227,38 @@ def build_file_tree(
229227 return branch
230228
231229
230+ def _infinite_iterator () -> Generator [str , None , None ]:
231+ while True :
232+ yield ""
233+
234+
232235def run_listing_tree (
233236 tps : GeoCom ,
234237 dev : str ,
235238 directory : str ,
236239 depth : int = 1
237240) -> None :
238- tree : FileTreeItem = {
239- "name" : directory ,
240- "size" : 0 ,
241- "children" : get_directory_items (
242- tps ,
243- dev ,
244- directory ,
245- 1 if depth == 0 else depth
246- )
247- }
241+ with progressbar (
242+ _infinite_iterator (),
243+ label = "Searching directories" ,
244+ item_show_func = lambda x : "" if x is None else str (x )
245+ ) as bar :
246+ tree : FileTreeItem = {
247+ "name" : (
248+ f"{ dev .upper ()} /{ directory } "
249+ if directory != "/"
250+ else dev .upper ()
251+ ),
252+ "size" : 0 ,
253+ "children" : get_directory_items (
254+ bar ,
255+ tps ,
256+ dev ,
257+ directory ,
258+ 1 if depth == 0 else depth
259+ )
260+ }
261+ bar .finish ()
248262
249263 treeview = build_file_tree (tree )
250264 rprint (treeview )
0 commit comments