| 242 | return ls_parser |
| 243 | |
| 244 | def execute(self, params, **kwargs): |
| 245 | show_folders = kwargs.get('folders_only') is True |
| 246 | show_records = kwargs.get('records_only') is True |
| 247 | show_detail = kwargs['detail'] if 'detail' in kwargs else False |
| 248 | if not show_folders and not show_records: |
| 249 | show_folders = True |
| 250 | show_records = True |
| 251 | fmt = kwargs.get('format') or '' |
| 252 | if fmt in ('json', 'csv'): |
| 253 | show_detail = True |
| 254 | |
| 255 | folder = params.folder_cache[params.current_folder] if params.current_folder in params.folder_cache else params.root_folder |
| 256 | pattern = kwargs['pattern'] if 'pattern' in kwargs else None |
| 257 | if pattern: |
| 258 | rs = try_resolve_path(params, kwargs['pattern']) |
| 259 | if rs is not None: |
| 260 | folder, pattern = rs |
| 261 | |
| 262 | regex = None |
| 263 | if pattern: |
| 264 | regex = re.compile(fnmatch.translate(pattern), re.IGNORECASE).match |
| 265 | |
| 266 | folders = [] # type: List[BaseFolderNode] |
| 267 | records = [] # type: List[vault.KeeperRecord] |
| 268 | |
| 269 | recursive_search = kwargs.get('recursive') |
| 270 | folder_uid = folder.uid or '' |
| 271 | if show_folders: |
| 272 | sub_folder_uids = get_contained_folder_uids(params, folder_uid, not recursive_search) |
| 273 | for uid in sub_folder_uids: |
| 274 | f = params.folder_cache[uid] |
| 275 | if any(filter(lambda x: regex(x) is not None, FolderListCommand.folder_match_strings(f))) if regex is not None else True: |
| 276 | folders.append(f) |
| 277 | |
| 278 | if show_records: |
| 279 | record_uids = set() |
| 280 | if params.record_cache and (folder_uid in params.subfolder_record_cache or recursive_search): |
| 281 | record_uids_by_folder = get_contained_record_uids(params, folder_uid, not recursive_search) |
| 282 | record_uids.update(rec for recs in record_uids_by_folder.values() for rec in recs) |
| 283 | record_uids.update(FolderListCommand._collect_nsf_record_uids(params, folder_uid, recursive_search)) |
| 284 | |
| 285 | for uid in record_uids: |
| 286 | r = FolderListCommand._load_record_for_ls(params, uid) |
| 287 | if not r: |
| 288 | continue |
| 289 | if regex and not regex(r.title): |
| 290 | continue |
| 291 | records.append(r) |
| 292 | |
| 293 | if len(folders) == 0 and len(records) == 0: |
| 294 | if pattern: |
| 295 | raise CommandError('ls', '{0}: No such folder or record'.format(pattern)) |
| 296 | else: |
| 297 | if show_detail: |
| 298 | # Helper function to get folder flags |
| 299 | def folder_flags(f): |
| 300 | if f.type == BaseFolderNode.SharedFolderType: |
| 301 | flags = 'S' |