- allow 'up' of a project directory (will automatically pull in all new
[opensuse:osc.git] / osc / commandline.py
1 #!/usr/bin/python
2
3 # Copyright (C) 2006 Peter Poeml.  All rights reserved.
4 # This program is free software; it may be used, copied, modified
5 # and distributed under the terms of the GNU General Public Licence,
6 # either version 2, or (at your option) any later version.
7
8 from core import *
9
10 def main():
11
12     cmd = sys.argv[1]
13     project = package = filename = None
14     # try: 
15     #     project = sys.argv[2]
16     #     package = sys.argv[3]
17     #     filename = sys.argv[4]
18     # except: 
19     #     pass
20
21     if cmd == 'init':
22         project = sys.argv[2]
23         package = sys.argv[3]
24         init_package_dir(project, package, os.path.curdir)
25         print 'Initializing %s (Project: %s, Package: %s)' % (os.curdir, project, package)
26
27     elif cmd == 'ls':
28         if len(sys.argv) == 2:
29             print '\n'.join(get_slash_source())
30         if len(sys.argv) == 3:
31             project = sys.argv[2]
32             print '\n'.join(meta_get_packagelist(project))
33         if len(sys.argv) == 4:
34             project = sys.argv[2]
35             package = sys.argv[3]
36             print '\n'.join(meta_get_filelist(project, package))
37
38     elif cmd == 'meta':
39         if len(sys.argv) == 4:
40             project = sys.argv[2]
41             package = sys.argv[3]
42             print ''.join(show_package_meta(project, package))
43             print ''.join(show_files_meta(project, package))
44         elif len(sys.argv) == 3:
45             project = sys.argv[2]
46             print ''.join(show_project_meta(project))
47
48     elif cmd == 'diff':
49         args = parseargs()
50         pacs = findpacs(args)
51
52         for p in pacs:
53             if p.todo == []:
54                 for i in p.filenamelist:
55                     if p.status(i) == 'M':
56                         p.todo.append(i)
57
58             d = []
59             for filename in p.todo:
60                 d.append('Index: %s\n' % filename)
61                 d.append('===================================================================\n')
62                 d.append(get_source_file_diff(p.dir, filename, p.rev))
63             if d:
64                 print ''.join(d)
65                 
66
67     elif cmd == 'co' or cmd == 'checkout':
68
69         try: 
70             project = sys.argv[2]
71             package = sys.argv[3]
72             filename = sys.argv[4]
73         except: 
74             pass
75
76         if filename:
77             get_source_file(project, package, filename)
78
79         elif package:
80             checkout_package(project, package)
81
82         else:
83             # all packages
84             for package in meta_get_packagelist(project):
85                 checkout_package(project, package)
86
87
88     elif cmd == 'st' or cmd == 'status':
89
90         args = parseargs()
91         pacs = findpacs(args)
92
93         for p in pacs:
94
95             # no files given as argument? Take all files in current dir
96             if not p.todo:
97                 p.todo = p.filenamelist + p.filenamelist_unvers
98
99             for filename in p.todo:
100                 s = p.status(filename)
101                 if s == 'F':
102                     print statfrmt('!', filename)
103                 elif s != ' ':
104                     print statfrmt(s, filename)
105
106
107     elif cmd == 'add':
108         if len(sys.argv) < 3:
109             print '%s requires at least one argument' % cmd
110             sys.exit(1)
111
112         filenames = parseargs()
113
114         for filename in filenames:
115             if not os.path.exists(filename):
116                 print "file '%s' does not exist" % filename
117                 sys.exit(1)
118
119         pacs = findpacs(filenames)
120
121         for pac in pacs:
122             for filename in pac.todo:
123                 if filename in exclude_stuff:
124                     continue
125
126                 pac.addfile(filename)
127                 print statfrmt('A', filename)
128
129
130     elif cmd == 'addremove':
131         args = parseargs()
132         pacs = findpacs(args)
133         for p in pacs:
134
135             p.todo = p.filenamelist + p.filenamelist_unvers
136
137             for filename in p.todo:
138                 if filename in exclude_stuff:
139                     continue
140                 state = p.status(filename)
141                 if state == '?':
142                     p.addfile(filename)
143                     print statfrmt('A', filename)
144                 elif state == '!':
145                     p.put_on_deletelist(filename)
146                     p.write_deletelist()
147                     os.unlink(os.path.join(p.storedir, filename))
148                     print statfrmt('D', filename)
149
150
151
152
153     elif cmd == 'ci' or cmd == 'checkin':
154         init_basicauth()
155
156         args = parseargs()
157
158         pacs = findpacs(args)
159
160         for p in pacs:
161             p.todo = p.filenamelist_unvers + p.filenamelist
162
163             for filename in p.todo:
164                 st = p.status(filename)
165                 if st == 'A' or st == 'M':
166                     p.todo_send.append(filename)
167                     print 'Sending        %s' % filename
168                 elif st == 'D':
169                     p.todo_delete.append(filename)
170                     print 'Deleting       %s' % filename
171
172             if not p.todo_send and not p.todo_delete:
173                 print 'nothing to do for package %s' % p.name
174                 continue
175
176             print 'Transmitting file data ', 
177             for filename in p.todo_send:
178                 put_source_file(p.prjname, p.name, os.path.join(p.dir, filename))
179                 #copy_file(filename, os.path.join(store, filename))
180             for filename in p.todo_delete:
181                 del_source_file(p.prjname, p.name, filename)
182                 p.to_be_deleted.remove(filename)
183
184             p.update_filesmeta()
185             p.write_deletelist()
186             print
187
188
189     elif cmd == 'up' or cmd == 'update':
190
191         args = parseargs()
192
193         for arg in args:
194
195             # when 'update' is run inside a project dir, it should...
196             if is_project_dir(arg):
197
198                 prj = Project(arg)
199
200                 # (a) update all packages
201                 for i in prj.pacs_have:
202                     args.append(i)
203
204                 # (b) fetch new packages
205                 prj.checkout_missing_pacs()
206                 args.remove(arg)
207
208
209         pacs = findpacs(args)
210
211         for p in pacs:
212
213             # save filelist before replacing the meta file
214             saved_filenames = p.filenamelist
215             p.update_filesmeta()
216             p = Package(p.dir)
217
218             # which files do no longer exist upstream?
219             disappeared = []
220             for filename in saved_filenames:
221                 if filename not in p.filenamelist:
222                     disappeared.append(filename)
223                 
224
225             for filename in saved_filenames:
226                 if filename in disappeared:
227                     print statfrmt('D', filename)
228                     p.delfile(filename)
229                     continue
230
231             for filename in p.filenamelist:
232
233                 state = p.status(filename)
234                 if state == 'M':
235                     print 'file %s is locally modified... fixme' % filename
236                     p.updatefile(filename)
237                     print statfrmt('U', filename)
238                 elif state == '!':
239                     p.updatefile(filename)
240                     print 'Restored \'%s\'' % filename
241                 elif state == 'F':
242                     p.updatefile(filename)
243                     print statfrmt('A', filename)
244                 elif state == ' ':
245                     pass
246
247
248             p.update_pacmeta()
249
250             print ljust(p.name, 45), 'At revision %s.' % p.rev
251                     
252
253
254             
255
256     elif cmd == 'rm' or cmd == 'delete':
257         if len(sys.argv) < 3:
258             print '%s requires at least one argument' % cmd
259             sys.exit(1)
260
261         args = parseargs()
262         pacs = findpacs(args)
263
264         for p in pacs:
265
266             for filename in p.todo:
267                 p.put_on_deletelist(filename)
268                 p.write_deletelist()
269                 try:
270                     os.unlink(os.path.join(p.dir, filename))
271                     os.unlink(os.path.join(p.storedir, filename))
272                 except:
273                     pass
274                 print statfrmt('D', filename)
275
276
277
278     elif cmd == 'id':
279         print ''.join(get_user_id(sys.argv[2]))
280
281
282     elif cmd == 'platforms':
283         if len(sys.argv) > 2:
284             project = sys.argv[2]
285             print '\n'.join(get_platforms_of_project(project))
286         else:
287             print '\n'.join(get_platforms())
288
289
290     elif cmd == 'results_meta':
291         wd = os.curdir
292         package = store_read_package(wd)
293         project = store_read_project(wd)
294         if len(sys.argv) > 2:
295             platform = sys.argv[2]
296             print ''.join(show_results_meta(project, package, platform))
297         else:
298             for platform in get_platforms_of_project(project):
299                 print ''.join(show_results_meta(project, package, platform))
300
301                 
302     elif cmd == 'results':
303         if len(sys.argv) > 3:
304             print 'getting results for more than one package is not supported'
305             print sys.exit(1)
306             
307         if len(sys.argv) == 3:
308             wd = sys.argv[2]
309         else:
310             wd = os.curdir
311         package = store_read_package(wd)
312         project = store_read_project(wd)
313
314         for platform in get_platforms_of_project(project):
315             print '\n'.join(get_results(project, package, platform))
316
317                 
318     elif cmd == 'log':
319         wd = os.curdir
320         package = store_read_package(wd)
321         project = store_read_project(wd)
322
323         platform = sys.argv[2]
324         arch = sys.argv[3]
325         print ''.join(get_log(project, package, platform, arch))
326
327
328     elif cmd == 'hist' or cmd == 'history':
329         args = parseargs()
330         pacs = findpacs(args)
331
332         for p in pacs:
333             print ''.join(get_history(p.prjname, p.name))
334
335
336     else:
337         print "unknown command '%s'" % cmd
338
339
340 if __name__ == '__main__':
341     init_basicauth()
342     main()
343