]> git.phdru.name Git - phdru.name/phdru.name.git/blob - gen-sitemap.py
1a78a7fb84b8fda32dbfdd1a3712ad8aa922668c
[phdru.name/phdru.name.git] / gen-sitemap.py
1 #! /usr/bin/env python
2
3 import argparse
4 from fnmatch import fnmatch
5 import os
6
7 parser = argparse.ArgumentParser(description='Generate sitemap')
8 parser.add_argument('-x', '--exclude', action='append',
9                     help='exclude directories (pattern)')
10 parser.add_argument('root_dir', help='Root dicrectory')
11 args = parser.parse_args()
12
13 exclude = []
14 for pat in args.exclude:
15     exclude.append(pat)
16     if not pat.endswith('/*'):
17         exclude.append(pat + '/*')
18
19 os.chdir(args.root_dir)
20 fullpath = os.getcwd()
21 fp_len = len(fullpath)
22
23 tree = ('', [])
24 current_subtree = tree[1]
25 save_level = 0
26
27 for dirpath, dirs, files in sorted(os.walk(fullpath)):
28     try:
29         dirpath = dirpath[fp_len:]
30         if not dirpath:
31             continue
32         for pat in exclude:
33             if fnmatch(dirpath, pat):
34                 raise StopIteration
35         parts = dirpath.split('/')
36         level = len(parts) - 2
37         if level < save_level:
38             current_subtree = tree[1]
39             for i in range(level):
40                 current_subtree = current_subtree[-1][1]
41             current_subtree.append((parts[-1], []))
42         elif level == save_level:
43             current_subtree.append((parts[-1], []))
44         elif level > save_level:
45             assert level - save_level == 1
46             current_subtree = current_subtree[-1][1]
47             current_subtree.append((parts[-1], []))
48         save_level = level
49     except StopIteration:
50         pass