Changeset 472
- Timestamp:
- 05/20/08 12:45:39
(8 months ago)
- Author:
- jmowery
- Message:
typo and bug fixes for storage
also finished converting cli portion
new storage is ready for initial (alpha) testing
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
- Property svn:executable set to *
| r471 |
r472 |
|
| | 1 | #! /usr/bin/python |
|---|
| 1 | 2 | import time |
|---|
| 2 | 3 | import os |
|---|
| … | … | |
| 207 | 208 | self.storage_dir = os.path.join(self.path, '.__storage__') |
|---|
| 208 | 209 | self.nodes_dir = os.path.join(self.path, '.__nodes__') |
|---|
| 209 | | self.config.read(self.config_path) |
|---|
| | 210 | self.config.read(self.status_path) |
|---|
| 210 | 211 | self.root = self.config.get('general', 'root') |
|---|
| 211 | 212 | self.logs_dir = os.path.join(self.root, '.__logs__') #logs are only kept at the root of the store |
|---|
| … | … | |
| 234 | 235 | def add_dir(self, name, local=False): |
|---|
| 235 | 236 | '''Add a directory to the store. This function is not recursive.''' |
|---|
| | 237 | now = int(time.time()) |
|---|
| 236 | 238 | e = Entry(name) |
|---|
| 237 | 239 | e.initial = now |
|---|
| … | … | |
| 263 | 265 | self.nodes_dir = '' |
|---|
| 264 | 266 | self.time = 0 |
|---|
| 265 | | else: |
|---|
| | 267 | else: |
|---|
| 266 | 268 | self.config.remove_option('entries', name) |
|---|
| 267 | 269 | |
|---|
| … | … | |
| 292 | 294 | cur = 0 |
|---|
| 293 | 295 | for t in times: |
|---|
| 294 | | if t > cur and t < date: |
|---|
| | 296 | if t > cur and t <= date: |
|---|
| 295 | 297 | cur = t |
|---|
| 296 | 298 | return cur |
|---|
| … | … | |
| 311 | 313 | if is_controlled(self.name): |
|---|
| 312 | 314 | self.storage = StorageData(self.name) |
|---|
| 313 | | for entry in self.storage.config.get_options('entries'): |
|---|
| | 315 | for entry in self.storage.config.options('entries'): |
|---|
| 314 | 316 | self.entries[entry] = pickle.loads(self.storage.config.get('entries', entry)) |
|---|
| 315 | 317 | self.description = self.storage.config.get('general', 'description') |
|---|
| … | … | |
| 329 | 331 | self.__init__(self.name) |
|---|
| 330 | 332 | return #. was placed under control recently re-init and return |
|---|
| 331 | | self.config.set('general', 'description', self.description) |
|---|
| | 333 | self.storage.config.set('general', 'description', self.description) |
|---|
| 332 | 334 | self.storage.root = find_control_root(self.storage.path) |
|---|
| 333 | | self.config.set('general', 'root', self.storage.root) |
|---|
| | 335 | self.storage.config.set('general', 'root', self.storage.root) |
|---|
| 334 | 336 | local_status_date = int(os.stat(self.storage.status_path)[stat.ST_MTIME]) |
|---|
| 335 | 337 | if self.storage.time < local_status_date: #on disk data changed since last access |
|---|
| … | … | |
| 376 | 378 | for entry in self.entries.keys(): |
|---|
| 377 | 379 | self.entries[entry].validate() |
|---|
| 378 | | self.storage.config.set('entries', entry, pickle.dumbs(self.entries[entry])) |
|---|
| | 380 | self.storage.config.set('entries', entry, pickle.dumps(self.entries[entry])) |
|---|
| 379 | 381 | self.storage.write() |
|---|
| 380 | 382 | self.modified = False |
|---|
| … | … | |
| 392 | 394 | if name == '.': |
|---|
| 393 | 395 | self.entries['.'].applied = date |
|---|
| 394 | | for n in list_controlled_files(): |
|---|
| | 396 | for n in self.list_controlled_files(): |
|---|
| 395 | 397 | self.entries[n].applied = date |
|---|
| 396 | 398 | self.modified = True |
|---|
| … | … | |
| 413 | 415 | if not os.path.exists(dest_path): |
|---|
| 414 | 416 | os.mkdir(dest_path) |
|---|
| 415 | | if not os.path.is_dir(dest_path): |
|---|
| | 417 | if not os.path.isdir(dest_path): |
|---|
| 416 | 418 | raise ValueError, '\'' + dest_path + '\' is not a directory.' |
|---|
| 417 | 419 | if not self.storage: |
|---|
| … | … | |
| 438 | 440 | if e.type !='FILE': |
|---|
| 439 | 441 | return '' |
|---|
| 440 | | cur = self.storage.find_recent(name, self.entries['.'].applied) |
|---|
| | 442 | cur = self.storage.find_recent(name, self.entries[name].applied) |
|---|
| 441 | 443 | if cur == 0: |
|---|
| 442 | 444 | return '' |
|---|
| … | … | |
| 454 | 456 | return '' |
|---|
| 455 | 457 | cur = self.storage.find_recent(name) |
|---|
| | 458 | if cur == 0: |
|---|
| | 459 | return '' |
|---|
| 456 | 460 | return os.path.join(self.storage.storage_dir, name) + '.' + str(cur) |
|---|
| 457 | 461 | |
|---|
| … | … | |
| 460 | 464 | name = os.path.basename(name) |
|---|
| 461 | 465 | path = os.path.join(self.storage.path, name) |
|---|
| 462 | | if os.path.is_dir(path): |
|---|
| | 466 | if os.path.isdir(path): |
|---|
| 463 | 467 | return False #for status purposes always return false on directories |
|---|
| 464 | 468 | if not os.path.exists(path) and name in self.entries.keys(): |
|---|
| 465 | 469 | return True #deletion is a modification |
|---|
| 466 | 470 | statinfo = os.stat(path) |
|---|
| 467 | | if statinfo.st_mtime > self.latest: |
|---|
| | 471 | if statinfo.st_mtime > self.entries[name].latest: |
|---|
| 468 | 472 | return True |
|---|
| 469 | 473 | return False |
|---|
| … | … | |
| 590 | 594 | self.storage.nodes_dir = os.path.join(self.storage.path, '.__nodes__') |
|---|
| 591 | 595 | os.mkdir(self.storage.nodes_dir) |
|---|
| 592 | | self.storage.logs_dir = os.path.join(self.storage.path, '__logs__') |
|---|
| | 596 | self.storage.logs_dir = os.path.join(self.storage.path, '.__logs__') |
|---|
| 593 | 597 | if not os.path.exists(self.storage.logs_dir): |
|---|
| 594 | 598 | os.mkdir(self.storage.logs_dir) |
|---|
| 595 | 599 | self.storage.status_path = os.path.join(self.storage.path, '.__status__') |
|---|
| 596 | | self.storage.config.add_section('general') |
|---|
| | 600 | if not self.storage.config.has_section('general'): |
|---|
| | 601 | self.storage.config.add_section('general') |
|---|
| 597 | 602 | self.storage.config.set('general', 'description', self.description) |
|---|
| 598 | 603 | self.storage.config.set('general', 'root', self.storage.root) |
|---|
| 599 | | self.storage.config.add_section('entries') |
|---|
| | 604 | if not self.storage.config.has_section('entries'): |
|---|
| | 605 | self.storage.config.add_section('entries') |
|---|
| 600 | 606 | self.entries['.'] = self.storage.add_dir('.') |
|---|
| 601 | 607 | self.storage.write() |
|---|
| … | … | |
| 662 | 668 | if name == '.': |
|---|
| 663 | 669 | st_type = '-' |
|---|
| 664 | | elif os.path.is_dir(os.path.join(store_path, name)): |
|---|
| | 670 | elif os.path.isdir(os.path.join(store_path, name)): |
|---|
| 665 | 671 | st_type = '+' |
|---|
| 666 | 672 | else: |
|---|
| … | … | |
| 736 | 742 | if entry in control_files: |
|---|
| 737 | 743 | continue |
|---|
| 738 | | stats.append(self.status_path(entry) + entry + self.version_suffix(entry)) |
|---|
| | 744 | stats.append(self.status_prefix(entry) + entry + self.version_suffix(entry)) |
|---|
| 739 | 745 | return stats |
|---|
| 740 | 746 | e = self.get_entry(names) |
|---|
| … | … | |
| 750 | 756 | |
|---|
| 751 | 757 | def revisions(self, names='.', recursive=False): |
|---|
| 752 | | '''Return a dictionary with a list of all versions of each named entry. Format is {(name,group):[<versions>]}''' |
|---|
| | 758 | '''Return a dictionary with a list of all versions of each named entry. Format is {(name,group):([<versions>],applied)}''' |
|---|
| 753 | 759 | if names is None: |
|---|
| 754 | 760 | raise ValueError, 'Must specify a name.' |
|---|
| … | … | |
| 766 | 772 | if names == '.': #everything in this dir |
|---|
| 767 | 773 | all_vers = set() |
|---|
| 768 | | for file in list_controlled_files(): |
|---|
| | 774 | for file in self.list_controlled_files(): |
|---|
| 769 | 775 | nrev = self.storage.list_revisions(file) |
|---|
| 770 | 776 | if recursive: |
|---|
| 771 | | revs[(file, self.name)] = nrev |
|---|
| 772 | | all_vers += set(nrev) |
|---|
| 773 | | revs[('.', self.name)] = list(all_vers) |
|---|
| | 777 | revs[(file, self.name)] = (nrev, self.entries[file].applied) |
|---|
| | 778 | all_vers |= set(nrev) |
|---|
| | 779 | revs[('.', self.name)] = (list(all_vers), self.entries['.'].applied) |
|---|
| 774 | 780 | if recursive and len(self.list_controlled_dirs()): |
|---|
| 775 | 781 | nrev = self.revisions(self.list_controlled_dirs(), recursive) |
|---|
| … | … | |
| 777 | 783 | revs[i] = nrev[i] |
|---|
| 778 | 784 | return revs |
|---|
| 779 | | elif os.path.is_dir(os.path.join(store_path, names)): # some other dir |
|---|
| | 785 | elif os.path.isdir(os.path.join(store_path, names)): # some other dir |
|---|
| 780 | 786 | l = Layer(os.path.join(store_path, names)) |
|---|
| 781 | 787 | revs = l.revisions('.', recursive) |
|---|
| … | … | |
| 792 | 798 | if not e: # local file not under control |
|---|
| 793 | 799 | return {} |
|---|
| 794 | | return {(names, self.name):self.list_revisions(names)} |
|---|
| | 800 | return {(names, self.name):(self.storage.list_revisions(names), self.entries[names].applied)} |
|---|
| 795 | 801 | |
|---|
| 796 | 802 | def list_controlled_files(self): |
|---|
| … | … | |
| 806 | 812 | dirs = [] |
|---|
| 807 | 813 | for e in self.entries.keys(): |
|---|
| 808 | | if self.entries[e] != 'FILES' and e != '.': |
|---|
| | 814 | if self.entries[e].type != 'FILE' and e != '.': |
|---|
| 809 | 815 | dirs.append(e) |
|---|
| 810 | 816 | return dirs |
|---|
| … | … | |
| 1254 | 1260 | l.remove(file_name) |
|---|
| 1255 | 1261 | l.update() |
|---|
| 1256 | | elif sys.argv[1] == 'rb+' or sys.argv[1] == 'rollback+': #XXX update me TODO |
|---|
| | 1262 | elif sys.argv[1] == 'rb+' or sys.argv[1] == 'rollback+': |
|---|
| 1257 | 1263 | l = Layer(os.getcwd()) |
|---|
| 1258 | 1264 | if len(sys.argv) < 3: |
|---|
| 1259 | 1265 | l.rollback(recursive=True) |
|---|
| 1260 | | else: |
|---|
| 1261 | | l.rollback(int(sys.argv[2]), True) |
|---|
| | 1266 | elif len(sys.argv) < 4: |
|---|
| | 1267 | l.rollback(int(sys.argv[2]), recursive=True) |
|---|
| | 1268 | else: |
|---|
| | 1269 | l.rollback(int(sys.argv[2]), sys.argv[3], True) |
|---|
| 1262 | 1270 | l.update() |
|---|
| 1263 | | elif sys.argv[1] == 'rb' or sys.argv[1] == 'rollback': #XXX update me TODO |
|---|
| | 1271 | elif sys.argv[1] == 'rb' or sys.argv[1] == 'rollback': |
|---|
| 1264 | 1272 | l = Layer(os.getcwd()) |
|---|
| 1265 | 1273 | if len(sys.argv) < 3: |
|---|
| 1266 | 1274 | l.rollback(recursive=False) |
|---|
| 1267 | | else: |
|---|
| 1268 | | l.rollback(int(sys.argv[2]), False) |
|---|
| | 1275 | elif len(sys.argv) < 4: |
|---|
| | 1276 | l.rollback(int(sys.argv[2]), '.', False) |
|---|
| | 1277 | else: |
|---|
| | 1278 | l.rollback(int(sys.argv[2]), sys.argv[3], False) |
|---|
| 1269 | 1279 | l.update() |
|---|
| 1270 | 1280 | elif sys.argv[1] == 'status' or sys.argv[1] == 'st': |
|---|
| … | … | |
| 1315 | 1325 | l = Layer(os.getcwd()) |
|---|
| 1316 | 1326 | l.checkin() |
|---|
| 1317 | | elif sys.argv[1] == 'revisions' or sys.argv[1] == 'rev': #XXX update me TODO |
|---|
| | 1327 | l.update() |
|---|
| | 1328 | elif sys.argv[1] == 'revisions' or sys.argv[1] == 'rev': |
|---|
| | 1329 | revs = {} |
|---|
| 1318 | 1330 | if len(sys.argv) < 3: |
|---|
| 1319 | 1331 | l = Layer(os.getcwd()) |
|---|
| 1320 | | l.print_revisions() |
|---|
| | 1332 | revs = l.revisions() |
|---|
| 1321 | 1333 | else: |
|---|
| 1322 | 1334 | for path_name in sys.argv[2:]: |
|---|
| … | … | |
| 1324 | 1336 | if os.path.isdir(path): |
|---|
| 1325 | 1337 | l = Layer(path) |
|---|
| 1326 | | l.print_revisions('.') |
|---|
| | 1338 | nrevs = l.revisions('.') |
|---|
| 1327 | 1339 | else: |
|---|
| 1328 | 1340 | layer_name = os.path.dirname(path) |
|---|
| 1329 | 1341 | file_name = os.path.basename(path) |
|---|
| 1330 | 1342 | l = Layer(layer_name) |
|---|
| 1331 | | l.print_revisions(file_name) |
|---|
| 1332 | | elif sys.argv[1] == 'revisions+' or sys.argv[1] == 'rev+': #XXX update me TODO |
|---|
| | 1343 | nrevs = l.revisions(file_name) |
|---|
| | 1344 | for i in nrevs.keys(): |
|---|
| | 1345 | revs[i] = nrevs[i] |
|---|
| | 1346 | for r in revs.items(): |
|---|
| | 1347 | if r[0][0] == '.': |
|---|
| | 1348 | print r[0][1] + ':' |
|---|
| | 1349 | else: |
|---|
| | 1350 | print os.path.join(r[0][1], r[0][0]) + ':' |
|---|
| | 1351 | r[1][0].sort() |
|---|
| | 1352 | for v in r[1][0]: |
|---|
| | 1353 | if v == r[1][1]: |
|---|
| | 1354 | print ' @' + str(v) |
|---|
| | 1355 | else: |
|---|
| | 1356 | print ' ' + str(v) |
|---|
| | 1357 | elif sys.argv[1] == 'revisions+' or sys.argv[1] == 'rev+': |
|---|
| | 1358 | revs = {} |
|---|
| 1333 | 1359 | if len(sys.argv) < 3: |
|---|
| 1334 | 1360 | l = Layer(os.getcwd()) |
|---|
| 1335 | | l.print_revisions(recursive=True) |
|---|
| | 1361 | revs = l.revisions(recursive=True) |
|---|
| 1336 | 1362 | else: |
|---|
| 1337 | 1363 | for path_name in sys.argv[2:]: |
|---|
| … | … | |
| 1339 | 1365 | if os.path.isdir(path): |
|---|
| 1340 | 1366 | l = Layer(path) |
|---|
| 1341 | | l.print_revisions('.', True) |
|---|
| | 1367 | nrevs = l.revisions('.', True) |
|---|
| 1342 | 1368 | else: |
|---|
| 1343 | 1369 | layer_name = os.path.dirname(path) |
|---|
| 1344 | 1370 | file_name = os.path.basename(path) |
|---|
| 1345 | 1371 | l = Layer(layer_name) |
|---|
| 1346 | | l.print_revisions(file_name) |
|---|
| | 1372 | nrevs = l.revisions(file_name) |
|---|
| | 1373 | for i in nrevs.keys(): |
|---|
| | 1374 | revs[i] = nrevs[i] |
|---|
| | 1375 | for r in revs.items(): |
|---|
| | 1376 | if r[0][0] == '.': |
|---|
| | 1377 | print r[0][1] + ':' |
|---|
| | 1378 | else: |
|---|
| | 1379 | print os.path.join(r[0][1], r[0][0]) + ':' |
|---|
| | 1380 | r[1][0].sort() |
|---|
| | 1381 | for v in r[1][0]: |
|---|
| | 1382 | if v == r[1][1]: |
|---|
| | 1383 | print ' @' + str(v) |
|---|
| | 1384 | else: |
|---|
| | 1385 | print ' ' + str(v) |
|---|
| 1347 | 1386 | elif sys.argv[1] == 'lock' or sys.argv[1] == 'lo': |
|---|
| 1348 | 1387 | if len(sys.argv) < 3: |
|---|
Download in other formats:
* Generating other formats may take time.