460 self._addfileindir(filename, status) |
460 self._addfileindir(filename, status) |
461 |
461 |
462 if status not in self.statuses: |
462 if status not in self.statuses: |
463 self.statuses.add(status) |
463 self.statuses.add(status) |
464 |
464 |
465 def _addfilestotersed(self, tersedict): |
465 def iterfilepaths(self): |
466 """ |
466 """ |
467 adds files to the their respective status list in the final tersed list |
467 adds files to the their respective status list in the final tersed list |
468 |
468 |
469 path is the path of parent directory of the file |
469 path is the path of parent directory of the file |
470 files is a list of tuple where each tuple is (filename, status) |
470 files is a list of tuple where each tuple is (filename, status) |
471 tersedict is a dictonary which contains each status abbreviation as key and |
|
472 list of files and tersed dirs in that status as value |
|
473 """ |
471 """ |
474 for f, st in self.files: |
472 for f, st in self.files: |
475 tersedict[st].append(os.path.join(self.path, f)) |
473 yield st, os.path.join(self.path, f) |
476 |
474 |
477 def _processtersestatus(self, tersedict, terseargs): |
475 def tersewalk(self, terseargs): |
478 """ |
476 """ |
479 a recursive function which process status for a certain directory. |
477 a recursive function which process status for a certain directory. |
480 |
478 |
481 self is an oject of dirnode class defined below. each object of dirnode |
479 self is an oject of dirnode class defined below. each object of dirnode |
482 class has a set of statuses which files in that directory has. This ease |
480 class has a set of statuses which files in that directory has. This ease |
492 |
490 |
493 Following are the cases which can happen: |
491 Following are the cases which can happen: |
494 |
492 |
495 1) All the files in the directory (including all the files in its |
493 1) All the files in the directory (including all the files in its |
496 subdirectories) share the same status and the user has asked us to terse |
494 subdirectories) share the same status and the user has asked us to terse |
497 that status. -> we add the directory name to status list and return |
495 that status. -> yield (status, dirpath) |
498 |
496 |
499 2) If '1)' does not happen, we do following: |
497 2) If '1)' does not happen, we do following: |
500 |
498 |
501 a) Add all the files which are in this directory (only the ones in |
499 a) Yield (status, filepath) for all the files which are in this |
502 this directory, not the subdirs) to their respective status list |
500 directory (only the ones in this directory, not the subdirs) |
503 |
501 |
504 b) Recurse the function on all the subdirectories of this |
502 b) Recurse the function on all the subdirectories of this |
505 directory |
503 directory |
506 """ |
504 """ |
507 |
505 |
509 onlyst = self.statuses.pop() |
507 onlyst = self.statuses.pop() |
510 |
508 |
511 # Making sure we terse only when the status abbreviation is |
509 # Making sure we terse only when the status abbreviation is |
512 # passed as terse argument |
510 # passed as terse argument |
513 if onlyst in terseargs: |
511 if onlyst in terseargs: |
514 tersedict[onlyst].append(self.path + pycompat.ossep) |
512 yield onlyst, self.path + pycompat.ossep |
515 return |
513 return |
516 |
514 |
517 # add the files to status list |
515 # add the files to status list |
518 self._addfilestotersed(tersedict) |
516 for st, fpath in self.iterfilepaths(): |
|
517 yield st, fpath |
519 |
518 |
520 #recurse on the subdirs |
519 #recurse on the subdirs |
521 for dirobj in self.subdirs.values(): |
520 for dirobj in self.subdirs.values(): |
522 dirobj._processtersestatus(tersedict, terseargs) |
521 for st, fpath in dirobj.tersewalk(terseargs): |
|
522 yield st, fpath |
523 |
523 |
524 def tersedir(statuslist, terseargs): |
524 def tersedir(statuslist, terseargs): |
525 """ |
525 """ |
526 terses the status if all the files in a directory shares the same status |
526 terses the status if all the files in a directory shares the same status |
527 |
527 |
534 stores the information required to know whether we can terse a certain |
534 stores the information required to know whether we can terse a certain |
535 directory or not. |
535 directory or not. |
536 |
536 |
537 tersedict (defined in the function) is a dictionary which has one word key |
537 tersedict (defined in the function) is a dictionary which has one word key |
538 for each status and a list of files and dir in that status as the respective |
538 for each status and a list of files and dir in that status as the respective |
539 value. The dictionary is passed to other helper functions which builds it. |
539 value. |
540 """ |
540 """ |
541 # the order matters here as that is used to produce final list |
541 # the order matters here as that is used to produce final list |
542 allst = ('m', 'a', 'r', 'd', 'u', 'i', 'c') |
542 allst = ('m', 'a', 'r', 'd', 'u', 'i', 'c') |
543 |
543 |
544 # checking the argument validity |
544 # checking the argument validity |
556 for f in getattr(statuslist, attrname): |
556 for f in getattr(statuslist, attrname): |
557 rootobj.addfile(f, attrname[0]) |
557 rootobj.addfile(f, attrname[0]) |
558 tersedict[attrname[0]] = [] |
558 tersedict[attrname[0]] = [] |
559 |
559 |
560 # we won't be tersing the root dir, so add files in it |
560 # we won't be tersing the root dir, so add files in it |
561 rootobj._addfilestotersed(tersedict) |
561 for st, fpath in rootobj.iterfilepaths(): |
|
562 tersedict[st].append(fpath) |
562 |
563 |
563 # process each sub-directory and build tersedict |
564 # process each sub-directory and build tersedict |
564 for subdir in rootobj.subdirs.values(): |
565 for subdir in rootobj.subdirs.values(): |
565 subdir._processtersestatus(tersedict, terseargs) |
566 for st, f in subdir.tersewalk(terseargs): |
|
567 tersedict[st].append(f) |
566 |
568 |
567 tersedlist = [] |
569 tersedlist = [] |
568 for st in allst: |
570 for st in allst: |
569 tersedict[st].sort() |
571 tersedict[st].sort() |
570 tersedlist.append(tersedict[st]) |
572 tersedlist.append(tersedict[st]) |