| """Utility class and function to get information about the CVS repository |
| based on checked-out files. |
| """ |
| |
| import os |
| |
| |
| def get_repository_list(paths): |
| d = {} |
| for name in paths: |
| if os.path.isfile(name): |
| dir = os.path.dirname(name) |
| else: |
| dir = name |
| rootfile = os.path.join(name, "CVS", "Root") |
| root = open(rootfile).readline().strip() |
| if not d.has_key(root): |
| d[root] = RepositoryInfo(dir), [name] |
| else: |
| d[root][1].append(name) |
| return d.values() |
| |
| |
| class RepositoryInfo: |
| """Record holding information about the repository we want to talk to.""" |
| cvsroot_path = None |
| branch = None |
| |
| # type is '', ':ext', or ':pserver:' |
| type = "" |
| |
| def __init__(self, dir=None): |
| if dir is None: |
| dir = os.getcwd() |
| dir = os.path.join(dir, "CVS") |
| root = open(os.path.join(dir, "Root")).readline().strip() |
| if root.startswith(":pserver:"): |
| self.type = ":pserver:" |
| root = root[len(":pserver:"):] |
| elif ":" in root: |
| if root.startswith(":ext:"): |
| root = root[len(":ext:"):] |
| self.type = ":ext:" |
| self.repository = root |
| if ":" in root: |
| host, path = root.split(":", 1) |
| self.cvsroot_path = path |
| else: |
| self.cvsroot_path = root |
| fn = os.path.join(dir, "Tag") |
| if os.path.isfile(fn): |
| self.branch = open(fn).readline().strip()[1:] |
| |
| def get_cvsroot(self): |
| return self.type + self.repository |
| |
| _repository_dir_cache = {} |
| |
| def get_repository_file(self, path): |
| filename = os.path.abspath(path) |
| if os.path.isdir(path): |
| dir = path |
| join = 0 |
| else: |
| dir = os.path.dirname(path) |
| join = 1 |
| try: |
| repodir = self._repository_dir_cache[dir] |
| except KeyError: |
| repofn = os.path.join(dir, "CVS", "Repository") |
| repodir = open(repofn).readline().strip() |
| repodir = os.path.join(self.cvsroot_path, repodir) |
| self._repository_dir_cache[dir] = repodir |
| if join: |
| fn = os.path.join(repodir, os.path.basename(path)) |
| else: |
| fn = repodir |
| return fn[len(self.cvsroot_path)+1:] |
| |
| def __repr__(self): |
| return "<RepositoryInfo for %s>" % `self.get_cvsroot()` |