Changeset 472

Show
Ignore:
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
  • branches/trunk-pmd-intproto/server/storage.py

    • Property svn:executable set to *
    r471 r472  
     1#! /usr/bin/python 
    12import time 
    23import os 
     
    207208                self.storage_dir = os.path.join(self.path, '.__storage__') 
    208209                self.nodes_dir = os.path.join(self.path, '.__nodes__') 
    209                 self.config.read(self.config_path) 
     210                self.config.read(self.status_path) 
    210211                self.root = self.config.get('general', 'root') 
    211212                self.logs_dir = os.path.join(self.root, '.__logs__') #logs are only kept at the root of the store 
     
    234235        def add_dir(self, name, local=False): 
    235236                '''Add a directory to the store. This function is not recursive.''' 
     237                now = int(time.time()) 
    236238                e = Entry(name) 
    237239                e.initial = now 
     
    263265                        self.nodes_dir = '' 
    264266                        self.time = 0 
    265                 else:   
     267                else: 
    266268                        self.config.remove_option('entries', name) 
    267269 
     
    292294                cur = 0 
    293295                for t in times: 
    294                         if t > cur and t < date: 
     296                        if t > cur and t <= date: 
    295297                                cur = t 
    296298                return cur 
     
    311313                if is_controlled(self.name): 
    312314                        self.storage = StorageData(self.name) 
    313                         for entry in self.storage.config.get_options('entries'): 
     315                        for entry in self.storage.config.options('entries'): 
    314316                                self.entries[entry] = pickle.loads(self.storage.config.get('entries', entry)) 
    315317                        self.description = self.storage.config.get('general', 'description') 
     
    329331                                self.__init__(self.name) 
    330332                                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) 
    332334                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) 
    334336                local_status_date = int(os.stat(self.storage.status_path)[stat.ST_MTIME]) 
    335337                if self.storage.time < local_status_date: #on disk data changed since last access 
     
    376378                for entry in self.entries.keys(): 
    377379                        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])) 
    379381                self.storage.write() 
    380382                self.modified = False 
     
    392394                if name == '.': 
    393395                        self.entries['.'].applied = date 
    394                         for n in list_controlled_files(): 
     396                        for n in self.list_controlled_files(): 
    395397                                self.entries[n].applied = date 
    396398                        self.modified = True 
     
    413415                if not os.path.exists(dest_path): 
    414416                        os.mkdir(dest_path) 
    415                 if not os.path.is_dir(dest_path): 
     417                if not os.path.isdir(dest_path): 
    416418                        raise ValueError, '\'' + dest_path + '\' is not a directory.' 
    417419                if not self.storage: 
     
    438440                if e.type !='FILE': 
    439441                        return '' 
    440                 cur = self.storage.find_recent(name, self.entries['.'].applied) 
     442                cur = self.storage.find_recent(name, self.entries[name].applied) 
    441443                if cur == 0: 
    442444                        return '' 
     
    454456                        return '' 
    455457                cur = self.storage.find_recent(name) 
     458                if cur == 0: 
     459                        return '' 
    456460                return os.path.join(self.storage.storage_dir, name) + '.' + str(cur) 
    457461 
     
    460464                name = os.path.basename(name) 
    461465                path = os.path.join(self.storage.path, name) 
    462                 if os.path.is_dir(path): 
     466                if os.path.isdir(path): 
    463467                        return False #for status purposes always return false on directories 
    464468                if not os.path.exists(path) and name in self.entries.keys(): 
    465469                        return True #deletion is a modification 
    466470                statinfo = os.stat(path) 
    467                 if statinfo.st_mtime > self.latest: 
     471                if statinfo.st_mtime > self.entries[name].latest: 
    468472                        return True 
    469473                return False 
     
    590594                self.storage.nodes_dir = os.path.join(self.storage.path, '.__nodes__') 
    591595                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__') 
    593597                if not os.path.exists(self.storage.logs_dir): 
    594598                        os.mkdir(self.storage.logs_dir) 
    595599                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') 
    597602                self.storage.config.set('general', 'description', self.description) 
    598603                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') 
    600606                self.entries['.'] = self.storage.add_dir('.') 
    601607                self.storage.write() 
     
    662668                        if name == '.': 
    663669                                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)): 
    665671                                st_type = '+' 
    666672                else: 
     
    736742                                        if entry in control_files: 
    737743                                                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)) 
    739745                        return stats 
    740746                e = self.get_entry(names) 
     
    750756 
    751757        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)}''' 
    753759                if names is None: 
    754760                        raise ValueError, 'Must specify a name.' 
     
    766772                if names == '.': #everything in this dir 
    767773                        all_vers = set() 
    768                         for file in list_controlled_files(): 
     774                        for file in self.list_controlled_files(): 
    769775                                nrev = self.storage.list_revisions(file) 
    770776                                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
    774780                        if recursive and len(self.list_controlled_dirs()): 
    775781                                nrev = self.revisions(self.list_controlled_dirs(), recursive) 
     
    777783                                        revs[i] = nrev[i] 
    778784                        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 
    780786                        l = Layer(os.path.join(store_path, names)) 
    781787                        revs = l.revisions('.', recursive) 
     
    792798                if not e: # local file not under control 
    793799                        return {} 
    794                 return {(names, self.name):self.list_revisions(names)} 
     800                return {(names, self.name):(self.storage.list_revisions(names), self.entries[names].applied)} 
    795801 
    796802        def list_controlled_files(self): 
     
    806812                dirs = [] 
    807813                for e in self.entries.keys(): 
    808                         if self.entries[e] != 'FILES' and e != '.': 
     814                        if self.entries[e].type != 'FILE' and e != '.': 
    809815                                dirs.append(e) 
    810816                return dirs 
     
    12541260                                l.remove(file_name) 
    12551261                                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+': 
    12571263                l = Layer(os.getcwd()) 
    12581264                if len(sys.argv) < 3: 
    12591265                        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) 
    12621270                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': 
    12641272                l = Layer(os.getcwd()) 
    12651273                if len(sys.argv) < 3: 
    12661274                        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) 
    12691279                l.update() 
    12701280        elif sys.argv[1] == 'status' or sys.argv[1] == 'st': 
     
    13151325                l = Layer(os.getcwd()) 
    13161326                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 = {} 
    13181330                if len(sys.argv) < 3: 
    13191331                        l = Layer(os.getcwd()) 
    1320                         l.print_revisions() 
     1332                        revs = l.revisions() 
    13211333                else: 
    13221334                        for path_name  in sys.argv[2:]: 
     
    13241336                                if os.path.isdir(path): 
    13251337                                        l = Layer(path) 
    1326                                         l.print_revisions('.') 
     1338                                        nrevs = l.revisions('.') 
    13271339                                else: 
    13281340                                        layer_name = os.path.dirname(path) 
    13291341                                        file_name = os.path.basename(path) 
    13301342                                        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 = {} 
    13331359                if len(sys.argv) < 3: 
    13341360                        l = Layer(os.getcwd()) 
    1335                         l.print_revisions(recursive=True) 
     1361                        revs = l.revisions(recursive=True) 
    13361362                else: 
    13371363                        for path_name  in sys.argv[2:]: 
     
    13391365                                if os.path.isdir(path): 
    13401366                                        l = Layer(path) 
    1341                                         l.print_revisions('.', True) 
     1367                                        nrevs = l.revisions('.', True) 
    13421368                                else: 
    13431369                                        layer_name = os.path.dirname(path) 
    13441370                                        file_name = os.path.basename(path) 
    13451371                                        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) 
    13471386        elif sys.argv[1] == 'lock' or sys.argv[1] == 'lo': 
    13481387                if len(sys.argv) < 3: