• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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