mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
	
	
		
			82 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			82 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								"""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()`
							 |