/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to tools/win32/ostools.py

  • Committer: John Arbash Meinel
  • Date: 2009-10-29 16:15:43 UTC
  • mto: This revision was merged to the branch mainline in revision 4780.
  • Revision ID: john@arbash-meinel.com-20091029161543-tdqlm2l4e2z5o7le
We don't have to pad 'short' records.

When writing a row, we reserve 120 bytes from the first node so that we
can write our 'B+Tree Graph Index' signature and other meta-information.
For the root node, we don't always use the 120 bytes, and for non-root
rows, we don't use that data at all. So we usually pad back that
record. However, for indexes that fit entirely in the root record,
we don't pad them to 4096, and it turns out we don't need to pad
them with the spare 120 bytes either.

I was doing a test with lots of 'chained' btree indexes, and this
extra padding ended up being 4.6M => 4.3M of wasted space. I imagine
that bzr-search will have a similar issue with tiny indexes.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
"""Cross-platform os tools: files/directories manipulations
 
4
Usage:
 
5
 
 
6
    ostools.py help
 
7
                    prints this help
 
8
 
 
9
    ostools.py copytodir FILES... DIR
 
10
                    copy files to specified directory
 
11
 
 
12
    ostools.py copytree FILES... DIR
 
13
                    copy files to specified directory keeping relative paths
 
14
 
 
15
    ostools.py remove [FILES...] [DIRS...]
 
16
                    remove files or directories (recursive)
 
17
"""
 
18
 
 
19
import glob
 
20
import os
 
21
import shutil
 
22
import sys
 
23
 
 
24
def makedir(dirname):
 
25
    if not os.path.exists(dirname):
 
26
        os.makedirs(dirname)
 
27
    if not os.path.isdir(dirname):
 
28
        print "Error: Destination is not a directory", dirname
 
29
        return 2
 
30
    return 0
 
31
 
 
32
def main(argv=None):
 
33
    if argv is None:
 
34
        argv = sys.argv[1:]
 
35
 
 
36
    if not argv:
 
37
        argv = ['help']
 
38
 
 
39
    cmd = argv.pop(0)
 
40
 
 
41
    if cmd == 'help':
 
42
        print __doc__
 
43
        return 0
 
44
 
 
45
    if cmd == 'copytodir':
 
46
        if len(argv) < 2:
 
47
            print "Usage:  ostools.py copytodir FILES... DIR"
 
48
            return 1
 
49
 
 
50
        todir = argv.pop()
 
51
        retcode = makedir(todir)
 
52
        if retcode:
 
53
            return retcode
 
54
 
 
55
        files = []
 
56
        for possible_glob in argv:
 
57
            files += glob.glob(possible_glob)
 
58
 
 
59
        for src in files:
 
60
            dest = os.path.join(todir, os.path.basename(src))
 
61
            shutil.copy(src, dest)
 
62
            print "Copied:", src, "=>", dest
 
63
 
 
64
        return 0
 
65
 
 
66
    if cmd == 'copytree':
 
67
        if len(argv) < 2:
 
68
            print "Usage:  ostools.py copytree FILES... DIR"
 
69
            return 1
 
70
 
 
71
        todir = argv.pop()
 
72
        retcode = makedir(todir)
 
73
        if retcode:
 
74
            return retcode
 
75
 
 
76
        files = []
 
77
        for possible_glob in argv:
 
78
            files += glob.glob(possible_glob)
 
79
 
 
80
        for src in files:
 
81
            relative_path = src
 
82
            dest = os.path.join(todir, relative_path)
 
83
            dest_dir = os.path.dirname(dest)
 
84
            retcode = makedir(dest_dir)
 
85
            if retcode:
 
86
                return retcode
 
87
            shutil.copy(src, dest)
 
88
            print "Copied:", src, "=>", dest
 
89
 
 
90
        return 0
 
91
 
 
92
    if cmd == 'remove':
 
93
        if len(argv) == 0:
 
94
            print "Usage:  ostools.py remove [FILES...] [DIRS...]"
 
95
            return 1
 
96
 
 
97
        filesdirs = []
 
98
        for possible_glob in argv:
 
99
            filesdirs += glob.glob(possible_glob)
 
100
 
 
101
        for i in filesdirs:
 
102
            if os.path.isdir(i):
 
103
                shutil.rmtree(i)
 
104
                print "Removed:", i
 
105
            elif os.path.isfile(i):
 
106
                os.remove(i)
 
107
                print "Removed:", i
 
108
            else:
 
109
                print "Not found:", i
 
110
 
 
111
        return 0
 
112
 
 
113
    if cmd == "basename":
 
114
        if len(argv) == 0:
 
115
            print "Usage:  ostools.py basename [PATH | URL]"
 
116
            return 1
 
117
 
 
118
        for path in argv:
 
119
            print os.path.basename(path)
 
120
        return 0
 
121
 
 
122
    if cmd == 'makedir':
 
123
        if len(argv) == 0:
 
124
            print "Usage:  ostools.py makedir DIR"
 
125
            return 1
 
126
 
 
127
        retcode = makedir(argv.pop())
 
128
        if retcode:
 
129
            return retcode
 
130
        return 0
 
131
 
 
132
    print "Usage error"
 
133
    print __doc__
 
134
    return 1
 
135
 
 
136
 
 
137
if __name__ == "__main__":
 
138
    sys.exit(main())