~bzr-pqm/bzr/bzr.dev

1861.2.18 by Alexander Belchenko
Makefile: cross-platform actions for building installer
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
2691.1.16 by Ian Clatworthy
Ensure doc hierarchy is setup correctly for the Windows installer
12
    ostools.py copytree FILES... DIR
13
                    copy files to specified directory keeping relative paths
14
1861.2.18 by Alexander Belchenko
Makefile: cross-platform actions for building installer
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
4392.3.21 by Sidnei da Silva
- Make build-installer work for both trunk and latest of both bzr and plugins
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
1861.2.18 by Alexander Belchenko
Makefile: cross-platform actions for building installer
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
4392.3.24 by Sidnei da Silva
- Fix a NameError
50
        todir = argv.pop()
51
        retcode = makedir(todir)
4392.3.21 by Sidnei da Silva
- Make build-installer work for both trunk and latest of both bzr and plugins
52
        if retcode:
53
            return retcode
1861.2.18 by Alexander Belchenko
Makefile: cross-platform actions for building installer
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
2691.1.16 by Ian Clatworthy
Ensure doc hierarchy is setup correctly for the Windows installer
66
    if cmd == 'copytree':
67
        if len(argv) < 2:
68
            print "Usage:  ostools.py copytree FILES... DIR"
69
            return 1
70
4392.3.24 by Sidnei da Silva
- Fix a NameError
71
        todir = argv.pop()
72
        retcode = makedir(todir)
4392.3.21 by Sidnei da Silva
- Make build-installer work for both trunk and latest of both bzr and plugins
73
        if retcode:
74
            return retcode
2691.1.16 by Ian Clatworthy
Ensure doc hierarchy is setup correctly for the Windows installer
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)
4392.3.21 by Sidnei da Silva
- Make build-installer work for both trunk and latest of both bzr and plugins
84
            retcode = makedir(dest_dir)
85
            if retcode:
86
                return retcode
2691.1.16 by Ian Clatworthy
Ensure doc hierarchy is setup correctly for the Windows installer
87
            shutil.copy(src, dest)
88
            print "Copied:", src, "=>", dest
89
90
        return 0
91
1861.2.18 by Alexander Belchenko
Makefile: cross-platform actions for building installer
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
4392.3.9 by Sidnei da Silva
- Getting really close now
113
    if cmd == "basename":
114
        if len(argv) == 0:
115
            print "Usage:  ostools.py basename [PATH | URL]"
116
            return 1
4392.3.21 by Sidnei da Silva
- Make build-installer work for both trunk and latest of both bzr and plugins
117
4392.3.9 by Sidnei da Silva
- Getting really close now
118
        for path in argv:
119
            print os.path.basename(path)
120
        return 0
121
4392.3.21 by Sidnei da Silva
- Make build-installer work for both trunk and latest of both bzr and plugins
122
    if cmd == 'makedir':
4392.3.22 by Sidnei da Silva
- Fix a few SNAFUs
123
        if len(argv) == 0:
4392.3.21 by Sidnei da Silva
- Make build-installer work for both trunk and latest of both bzr and plugins
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
1861.2.18 by Alexander Belchenko
Makefile: cross-platform actions for building installer
132
    print "Usage error"
133
    print __doc__
134
    return 1
135
136
137
if __name__ == "__main__":
138
    sys.exit(main())