-
Notifications
You must be signed in to change notification settings - Fork 0
/
check_files.py
99 lines (80 loc) · 2.23 KB
/
check_files.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# checking for changes in a file
# store last known metadata
# traverse dir
# - if file changed after last known change
# - compare hash to last hash
# - if hash is different then make a commit and push
#
# check if it's possible to be notified of file changes
#
# what happens when there are conflicts?
# what about branches?
# how to present all of this to the user?
# how to install everything? Mkae sure it works?
# needs git
# git is weird on windows ...
import sys, hashlib, os
import cPickle as pickle
from get_list import files
def checksum(path):
print ""
print "Checking:"
sys.stdout.write(path)
hash = hashlib.sha512()
size = os.path.getsize(path)
n = size/16384 + 1
interval = n/40
x = 0
i = 0.0
if n>1280:
print ""
sys.stdout.write(str(i)+'%')
with open(path, 'rb') as f:
for chunk in iter(lambda: f.read(128*hash.block_size), ''):
x = x+1
if n>1280:
if x>=interval:
sys.stdout.write(".")
x = 0
i = i + 2.5
if i%25 ==0:
sys.stdout.write(str(i)+'%')
hash.update(chunk)
print ""
print " DONE!"
return hash.hexdigest()
def load():
try:
return pickle.load(open('meta.p', 'rb'))
except IOError:
return {}
def store(changed, old):
data = old
print ""
for f in changed:
data[f] = {'time': os.path.getmtime(f),
'checksum': checksum(f)}
pickle.dump(data, open('meta.p', 'wb'))
def changed(dir):
old_meta = load()
suspects = []
data = files(dir)
for path in data.keys():
try:
if data[path] != old_meta[path]['time']:
suspects.append(path)
except KeyError:
suspects.append(path)
def check(path):
try:
return checksum(path) != old_meta[path]['checksum']
except KeyError:
return True
suspects = filter(check, suspects)
store(suspects, old_meta)
return suspects
if __name__ == '__main__':
try:
print changed(sys.argv[1])
except IndexError:
print "You need to give a directory mate"