Welcome, guest | Sign In | My Account | Store | Cart
#!/usr/bin/env python
# -*- coding: utf8 -*-

__version__
= '$Id: svn_redater.py 748 2010-07-30 09:59:56Z mn $'

USAGE
= "svn_redater.py\n\tredate source files according to svn data"

"""
Iterates through a directory, reading the data from svn info that looks like:
   $Id: svn_redater.py 748 2010-07-30 09:59:56Z mn $
from source files.
Parses the datetime from svn info and if it differs from file
modification datetime then changes file datetime

author: Michal Niklas
"""


import re
import os
import os.path
import sys
import time

ALL_CNT
= 0
CHANGED_CNT
= 0
DEBUG
= 0

# which file should be checked
EXTENSIONS
= ('.py', '.pas', '.inc', '.java', '.c', '.cpp', '.h',)


def log_error(s):
        sys
.stderr.write('%s\n' % (s))


def show_fdt(fdt):
       
"""human readable format of file modification datetime"""
       
return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(fdt))


def svndtinfo2time(ts):
       
"""changes svn date ('2009-10-30 13:17:45') to number of seconds since 1970-01-01"""
        tpl
= time.strptime(ts+'UTC', '%Y-%m-%d %H:%M:%S%Z')
       
return time.mktime(tpl)


dt_re
= re.compile(r'\d+ (\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d)Z ')

def extract_svn_dt(line):
       
"""change svn info:
                '$Id: svn_redater.py 748 2010-07-30 09:59:56Z mn $'
        into
                '2009-10-30 13:17:45'"""

        result
= None
        rx
= dt_re.search(line)
       
if rx:
                result
= rx.group(1)
       
return result


def redate_file(fn):
       
"""redates file if file modification datetime differs from svn info"""
       
global ALL_CNT, CHANGED_CNT
        ALL_CNT
+= 1
        svn_dt
= None
        s
= os.stat(fn)
        file_time
= s[8]
       
if DEBUG:
               
print(fn)
        f
= open(fn, 'rb')
       
try:
               
for line in f.readlines():
                       
if '$Id:' in line:
                                svn_dt
= extract_svn_dt(line)
                               
break
       
finally:
                f
.close()
       
if svn_dt:
                svn_time
= svndtinfo2time(svn_dt)
                secs_diff
= file_time - svn_time
                MAX_DIFF
= 130.0
               
if secs_diff > MAX_DIFF or secs_diff < -MAX_DIFF:
                       
print "%s    %s -> %s" % (fn, show_fdt(file_time), show_fdt(svn_time))
                        os
.utime(fn, (svn_time, svn_time))
                        CHANGED_CNT
+= 1


def process_dir(_, dir_name, files):
       
"""looks for source files in dir"""
        sys
.stdout.write('%-70s\r' % (dir_name))
       
for fname in files:
                can_change
= False
                fnl
= fname.lower()
               
for ext in EXTENSIONS:
                       
if fnl.endswith(ext):
                                can_change
= True
                               
break
               
if can_change:
                        fname
= os.path.join(dir_name, fname)
                       
if os.path.isfile(fname):
                                redate_file
(fname)


def main():
        os
.path.walk('.', process_dir, None)
       
print '\nChecked: %d\nChanged %d\n' % (ALL_CNT, CHANGED_CNT)


if '--version' in sys.argv:
       
print __version__
else:
       
if __name__ == '__main__':
               
if '--help' in sys.argv:
                       
print USAGE
               
else:
                        main
()

History