1#!/usr/bin/env python 2# 3# Copyright (C) 2009 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the 'License'); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an 'AS IS' BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17 18import json, hashlib, operator, os, sys 19 20def get_file_size(path): 21 st = os.lstat(path) 22 return st.st_size; 23 24def get_file_digest(path): 25 if os.path.isfile(path) == False: 26 return "----------------------------------------------------------------" 27 digest = hashlib.sha256() 28 with open(path, 'rb') as f: 29 while True: 30 buf = f.read(1024*1024) 31 if not buf: 32 break 33 digest.update(buf) 34 return digest.hexdigest(); 35 36def main(argv): 37 output = [] 38 roots = argv[1:] 39 for root in roots: 40 base = len(root[:root.rfind(os.path.sep)]) 41 for dir, dirs, files in os.walk(root): 42 relative = dir[base:] 43 for f in files: 44 try: 45 path = os.path.sep.join((dir, f)) 46 row = { 47 "Size": get_file_size(path), 48 "Name": os.path.sep.join((relative, f)), 49 "SHA256": get_file_digest(path), 50 } 51 output.append(row) 52 except os.error: 53 pass 54 output.sort(key=operator.itemgetter("Size", "Name"), reverse=True) 55 print json.dumps(output, indent=2, separators=(',',': ')) 56 57if __name__ == '__main__': 58 main(sys.argv) 59