source: pyutilib.svn/trunk/pyutilib/svn/database.py @ 2832

Revision 2832, 5.8 KB checked in by wehart, 2 years ago (diff)

Portability fixes for Python 3.x

Line 
1#!/usr/bin/env python
2#  _________________________________________________________________________
3#
4#  PyUtilib: A Python utility library.
5#  Copyright (c) 2008 Sandia Corporation.
6#  This software is distributed under the BSD License.
7#  Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
8#  the U.S. Government retains certain rights in this software.
9#  _________________________________________________________________________
10#
11import os
12import sys
13import yaml
14
15from pyutilib.svn.core import log
16from pyutilib.svn.repository import Repository, SvnError
17
18class DatabaseError(Exception):
19    """Exception raised accessing Repository Database cache."""
20
21class RepositoryDatabase(object):
22
23    def __init__(self, filename=None):
24        self.repos = {}
25        if filename:
26            self.cache_file = filename
27        else:
28            self.cache_file = RepositoryDatabase.default_db()
29
30    @staticmethod
31    def default_db():
32        return os.environ["HOME"]+os.sep+".pyutilib.svn" + os.sep+'cache.yaml'
33
34    def load(self):
35        if not os.path.exists( self.cache_file ):
36            raise DatabaseError("Repository database file %s does not exist" % \
37                                 self.cache_file)
38        log.info("Reading repository database from '%s'" % self.cache_file)
39        INPUT=open(self.cache_file)
40        self.repos = yaml.load(INPUT)
41        INPUT.close()
42
43    def save(self, stream=None):
44        dir, fname = os.path.split(self.cache_file)
45        if not fname:
46            raise DatabaseError( "Cache file (%s) specifies a directory!" % \
47                              self.cache_file )
48        if dir and not os.path.exists( dir ):
49            os.mkdir( dir )
50        if stream is None:
51            log.info("Writing repository database to '%s'" % self.cache_file)
52            OUTPUT=open(self.cache_file, 'w')
53        else:
54            OUTPUT=stream
55
56        OUTPUT.write("# All svn repositories added to this database\n")
57        yaml.dump(self.repos, OUTPUT, default_flow_style=False,
58                  explicit_start=True, explicit_end=True)
59
60        if stream is None:
61            OUTPUT.close()
62
63    def add(self, url):
64        try:
65            r = Repository(url)
66        except SvnError:
67            e = sys.exc_info()[0]
68            log.error("adding repository (%s) failed:\n%s" % ( url, str(e) ))
69            raise
70        if r.url in self.repos:
71            raise DatabaseError( "Repository (%s) already in database as %s"
72                              % ( url, r.url ) )
73        r.update()
74        self.repos[r.url] = r
75        return r
76
77    def remove(self, url):
78        # If the user provided a valid repo URL, delete it and return.
79        try:
80            del self.repos[url]
81            return
82        except KeyError:
83            pass
84
85        # Hopefully, this repo still exists: try and resolve it.
86        try:
87            r = Repository(url)
88        except SvnError:
89            e = sys.exc_info()[0]
90            log.error("deleting repository (%s) failed:\n%s" % ( url, str(e) ))
91            raise
92        try:
93            del self.repos[r.url]
94        except KeyError:
95            raise DatabaseError( "Repository (%s) not in database" % url )
96
97    def update(self, repo=None):
98        updated = False
99        for r in self.get_repositories(repo):
100            updated |= r.update()
101        return updated
102
103    def rescan(self, repo=None):
104        for r in self.get_repositories(repo):
105            r.revision = 0;
106            r.projects = {}
107            r.update()
108
109    def get_repositories(self, repo):
110        if repo is None:
111            return self.repos.values()
112        else:
113            if repo is Repository:
114                return [ repo ]
115            elif repo in self.repos:
116                return [ self.repos[repo] ]
117            else:
118                repos = []
119                for name, r in self.repos.iterkeys():
120                    if re.search(repo, name):
121                        repos.append(r)
122                return repos
123
124    def __str__(self):
125        ans = ""
126        repo_list = self.repos.keys()
127        repo_list.sort()
128        for r in repo_list:
129            ans = ans + str(self.repos[r])
130        return ans
131
132
133if __name__ == "__main__":
134    me = os.path.basename(sys.argv[0])
135    # Check for sane usage.
136    if len(sys.argv) < 2:
137        print("Usage: %s command [options]" % (me))
138        print("")
139        print("Available commands:")
140        print("   add")
141        print("   remove")
142        print("   update")
143        print("   rescan")
144        print("   print")
145        print("")
146        sys.exit(1)
147
148    db = RepositoryDatabase()
149    try:
150        db.load()
151    except DatabaseError:
152        log.info("cache file DNE; initializing empty database")
153
154    cmd = sys.argv[1]
155    if cmd == "add":
156        if len(sys.argv) != 3:
157            print("Usage: %s add repository_url" % (me))
158            sys.exit(1)
159        db.add(sys.argv[2])
160        db.save()
161    if cmd == "remove":
162        if len(sys.argv) != 3:
163            print("Usage: %s remove repository_url" % (me))
164            sys.exit(1)
165        db.remove(sys.argv[2])
166        db.save()
167    if cmd == "update":
168        if len(sys.argv) != 2:
169            print("Usage: %s update" % (me))
170            sys.exit(1)
171        db.update()
172        db.save()
173    if cmd == "rescan":
174        if len(sys.argv) != 2:
175            print("Usage: %s rescan" % (me))
176            sys.exit(1)
177        db.rescan()
178        db.save()
179    if cmd == "print":
180        if len(sys.argv) != 2:
181            print("Usage: %s print" % (me))
182            sys.exit(1)
183        print(db)
184    if cmd == "list":
185        if len(sys.argv) != 3:
186            print("Usage: %s list <component>" % (me))
187            sys.exit(1)
188        if sys.argv[2] == 'repos':
189            repos = db.repos.keys()
190            repos.sort()
191            for r in repos:
192                print(r)
Note: See TracBrowser for help on using the repository browser.