рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрдХреИрдирд░ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБ-рдШрдЯрдХ рдкреНрд░рдгрд╛рд▓реА рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╣рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреЛрдб рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдФрд░ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд╣рд▓реЗ рд╣реА рдХрдИ рд╣рдЬрд╛рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдИ рд╣реИ рдФрд░ рд╡реГрджреНрдзрд┐ рдЬрд╛рд░реА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕ рд╡рд┐рдХрд╛рд╕ рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд░реЗрдбреА рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдиреНрд╣реЗрдВ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рднреБрд▓рд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рдмреАрдЪ, рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдЕрдХреНрд╕рд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░реАрдХреНрд╖рдХ-рд╕реНрд╡рдЪрд╛рд▓рди рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреА рд▓рд╛рдкрд░рд╡рд╛рд╣реА рдХреЗ рдХрд╛рд░рдг, рддреИрдпрд╛рд░-рдХрд┐рдП рдЧрдП рдбрд┐рдмрдЧ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред
рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдХрдИ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реЛ, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣ рд╣рдореЗрд╢рд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рддреНрдпрд╛рдкрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди рддрд░реНрдХ рдХрд┐ рд▓реЗрдЦрдХ рдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рднреА рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдХреЛрдб рдХреА рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рддрдВрддреНрд░
рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рд╕рдВрд╢реЛрдзрди, рд╣реИрд╢ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
(func_hash, func_source)
рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрди рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
{"funcName1": (funcName1_hash, funcName1_source), "funcName2": (funcName2_hash, funcName2_source), ...}
рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд┐рдХрд╕рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рднреА рдХрд╛рд░реНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред рд╕рднреА рд╕рдВрд╢реЛрдзрди рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ (рд╕рдВрд╢реЛрдзрди рдлрд╝рд╛рдЗрд▓) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдВрддрд┐рдо рд╕рдВрд╢реЛрдзрди рдХреА рддрд┐рдерд┐ рдФрд░ рд╕рдВрд╢реЛрдзрди рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ:
[revision's last date-n-time, {revisions}]
рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓реА рдХреА рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдереЛрдбрд╝реЗ рд╕рдордп рдореЗрдВ рдкреБрд░рд╛рдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдХреЛрдб рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдмрд╕ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╢реЛрдзрди рд╕реЗ рдХреЙрдкреА рдХрд░реЗрдВред
рдмреЗрд╢рдХ, рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдирд┐рд░реАрдХреНрд╖рдг рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬреАрдЖрдИрдЯреА, рдПрд╕рд╡реАрдПрди)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд░реАрдХреНрд╖рдг рдмреЗрдХрд╛рд░ рд╣реИрдВ рдпрджрд┐ рдЖрдк рд╕реИрдХрдбрд╝реЛрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реНрд╡рдд: рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрдЫ рд╡рд┐рд▓рдп рдХреЗ рдмрд╛рдж рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рдПрдХ рд╢реНрд░рдорд╕рд╛рдзреНрдп рдФрд░ рд▓рдВрдмреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдФрд░ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдмрдиреА рд╣реБрдИ рд╣реИ - рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рд╕рдВрд╢реЛрдзрди рддрдВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рднреА рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреЛрдб
рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдореЙрдбреНрдпреВрд▓ FileRevision.py рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рдВрд╢реЛрдзрди () рд╡рд░реНрдЧ рдХреЛ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдореЙрдбреНрдпреВрд▓ рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд╢реЛрдзрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдирд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред
рд▓рд┐рдВрдХ рдкрд░ рдХреЛрдб рдЙрдкрд▓рдмреНрдз рд╣реИред
рдореЙрдбреНрдпреВрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╡рд░реНрдЧ рд╕рдВрд╢реЛрдзрди ():__in __ () # рдкреИрд░рд╛рдореАрдЯрд░ рдЖрд░рдВрднреАрдХрд░рдг def __init__(self, fileRevision='revision.txt'): self.fileRevision = fileRevision self.mainRevision = self._ReadFromFile(self.fileRevision)
_ReadFromFile () # рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрд╢реЛрдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ def _ReadFromFile(self, file=None): """ Helper function that parse and return revision from file. """ revision = [None, {}] if file == None: file = self.fileRevision try: if os.path.exists(file) and os.path.isfile(file): with open(file) as fH: revision = eval(fH.read()) except: traceback.print_exc() finally: return revision
_WriteToFile () # рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рд▓рд┐рдЦреЗрдВред def _WriteToFile(self, revision=[None, {}], file=None): """ Helper procedure than trying to write given revision to file. """ status = False if file == None: file = self.fileRevision try: with open(file, "w") as fH: fH.write(str(revision)) status = True except: traceback.print_exc() finally: return status
_GetOld () # рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓рд╛ рд╕рдВрд╢реЛрдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред def _GetOld(self, func=None): """ Get old revision for given function and return tuple: (old_hash, old_source). """ funcHashOld = None
_GetNew () # рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕рдВрд╢реЛрдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред def _GetNew(self, func=None): """ Get new revision for given function and return tuple: (new_hash, new_source). """ funcSourceNew = None
_Similar () # рджреЛ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ред def _Similar(self, hashOld, sourceOld, hashNew, sourceNew): """ Checks if given params for modified then return tuple with revision's diff: (old_revision, new_revision), otherwise return None. """ similar = True
рдЕрджреНрдпрддрди () # рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред def Update(self, func=None): """ Set new revision for function. revision = [revision date-n-time, {"funcName1": (funcName1_hash, funcName1_source), {"funcName2": (funcName2_hash, funcName2_source), ...}] """ status = False if func: try: funcSourceNew = inspect.getsource(func)
DeleteAll () # рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рднреА рд╕рдВрд╢реЛрдзрди рд╣рдЯрд╛рдПрдБред def DeleteAll(self): """ Helper function that parse and return revision from file. """ status = False try: self.mainRevision = [None, {}]
ShowOld () # рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рд╕рдВрд╢реЛрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред def ShowOld(self, func=None): """ Function return old revision for given function. """ funcHashOld, funcSourceOld = self._GetOld(func)
ShowNew () # рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рд╕рдВрд╢реЛрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред def ShowNew(self, func=None): """ Function return old revision for given function. """ funcHashNew, funcSourceNew = self._GetNew(func)
рдореБрд╢реНрдХрд┐рд▓ () # рд╕рдВрд╢реЛрдзрди рдХреА рддреБрд▓рдирд╛ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЕрдВрддрд░ред def Diff(self, func=None): """ Checks if given function modified then return tuple with revision's diff: (old_revision, new_revision), otherwise return None. """ funcHashOld, funcSourceOld = self._GetOld(func)
рдореЙрдбреНрдпреВрд▓ рдСрдкрд░реЗрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП _testFunction () # рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди def _testFunction(a=None): """ This is fake test function for module. """
рдЕрдЧрд░ __name__ == '__main__' :() # рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЬрдм рдЗрд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдЗрд╕реЗ рдкрд╛рдпрдерди 3.2.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
рдЕрдЬрдЧрд░ FileRevision.py
рдкрд╣рд▓реА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдирдХрд▓реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧреА, рдЗрд╕рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧреА, рд╕рдВрд╢реЛрдзрди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдЧреА, рдФрд░ рдкрд┐рдЫрд▓реЗ рдФрд░ рдирдП рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧреАред рдлрд┐рд░, .py рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрдЧрд▓ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╢реЛрдзрдиред Txt рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИ рдЬрд╛рдПрдЧреАред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдХреЛрдб рд╕рдВрд╢реЛрдзрди рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдХ рдХрд░реНрдордЪрд╛рд░реА рд╣реЛрдиреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдбрд┐рдЧреНрд░реА рдмрдврд╝ рдЬрд╛рдПрдЧреАред
рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реАред рд╣рдо рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рддреИрдореВрд░ рдЧрд┐рд▓реНрдореБрд▓рд┐рди, рдкреЙрдЬрд┐рдЯрд┐рд╡ рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреАрдЬ рдСрдЯреЛрдореЗрдЯреЗрдб рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдЧреНрд░реБрдк