| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | """Utilities for CVS administration.""" | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import time | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | import md5 | 
					
						
							|  |  |  | import fnmatch | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-10-07 19:25:25 +00:00
										 |  |  | if not hasattr(time, 'timezone'): | 
					
						
							|  |  |  | 	time.timezone = 0 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | class File: | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	"""Represent a file's status.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Instance variables: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	file -- the filename (no slashes), None if uninitialized | 
					
						
							|  |  |  | 	lseen -- true if the data for the local file is up to date | 
					
						
							|  |  |  | 	eseen -- true if the data from the CVS/Entries entry is up to date | 
					
						
							|  |  |  | 	         (this implies that the entry must be written back) | 
					
						
							|  |  |  | 	rseen -- true if the data for the remote file is up to date | 
					
						
							| 
									
										
										
										
											1995-05-01 20:06:06 +00:00
										 |  |  | 	proxy -- RCSProxy instance used to contact the server, or None | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	Note that lseen and rseen don't necessary mean that a local | 
					
						
							|  |  |  | 	or remote file *exists* -- they indicate that we've checked it. | 
					
						
							|  |  |  | 	However, eseen means that this instance corresponds to an | 
					
						
							|  |  |  | 	entry in the CVS/Entries file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	If lseen is true: | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	lsum -- checksum of the local file, None if no local file | 
					
						
							|  |  |  | 	lctime -- ctime of the local file, None if no local file | 
					
						
							|  |  |  | 	lmtime -- mtime of the local file, None if no local file | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	If eseen is true: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	erev -- revision, None if this is a no revision (not '0') | 
					
						
							|  |  |  | 	enew -- true if this is an uncommitted added file | 
					
						
							|  |  |  | 	edeleted -- true if this is an uncommitted removed file | 
					
						
							|  |  |  | 	ectime -- ctime of last local file corresponding to erev | 
					
						
							|  |  |  | 	emtime -- mtime of last local file corresponding to erev | 
					
						
							| 
									
										
										
										
											1995-06-21 01:00:46 +00:00
										 |  |  | 	extra -- 5th string from CVS/Entries file | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	If rseen is true: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	rrev -- revision of head, None if non-existent | 
					
						
							|  |  |  | 	rsum -- checksum of that revision, Non if non-existent | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	If eseen and rseen are both true: | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	esum -- checksum of revision erev, None if no revision | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Note | 
					
						
							|  |  |  | 	"""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def __init__(self, file = None): | 
					
						
							|  |  |  | 		if file and '/' in file: | 
					
						
							|  |  |  | 			raise ValueError, "no slash allowed in file" | 
					
						
							|  |  |  | 		self.file = file | 
					
						
							|  |  |  | 		self.lseen = self.eseen = self.rseen = 0 | 
					
						
							| 
									
										
										
										
											1995-05-01 20:06:06 +00:00
										 |  |  | 		self.proxy = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def __cmp__(self, other): | 
					
						
							|  |  |  | 		return cmp(self.file, other.file) | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	def getlocal(self): | 
					
						
							|  |  |  | 		try: | 
					
						
							|  |  |  | 			self.lmtime, self.lctime = os.stat(self.file)[-2:] | 
					
						
							|  |  |  | 		except os.error: | 
					
						
							| 
									
										
										
										
											1995-05-01 20:06:06 +00:00
										 |  |  | 			self.lmtime = self.lctime = self.lsum = None | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1995-05-01 20:06:06 +00:00
										 |  |  | 			self.lsum = md5.md5(open(self.file).read()).digest() | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 		self.lseen = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def getentry(self, line): | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		words = string.splitfields(line, '/') | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 		if self.file and words[1] != self.file: | 
					
						
							|  |  |  | 			raise ValueError, "file name mismatch" | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		self.file = words[1] | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 		self.erev = words[2] | 
					
						
							|  |  |  | 		self.edeleted = 0 | 
					
						
							|  |  |  | 		self.enew = 0 | 
					
						
							|  |  |  | 		self.ectime = self.emtime = None | 
					
						
							|  |  |  | 		if self.erev[:1] == '-': | 
					
						
							|  |  |  | 			self.edeleted = 1 | 
					
						
							|  |  |  | 			self.erev = self.erev[1:] | 
					
						
							|  |  |  | 		if self.erev == '0': | 
					
						
							|  |  |  | 			self.erev = None | 
					
						
							|  |  |  | 			self.enew = 1 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 			dates = words[3] | 
					
						
							|  |  |  | 			self.ectime = unctime(dates[:24]) | 
					
						
							|  |  |  | 			self.emtime = unctime(dates[25:]) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		self.extra = words[4] | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 		if self.rseen: | 
					
						
							|  |  |  | 			self.getesum() | 
					
						
							|  |  |  | 		self.eseen = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-05-01 20:06:06 +00:00
										 |  |  | 	def getremote(self, proxy = None): | 
					
						
							|  |  |  | 		if proxy: | 
					
						
							|  |  |  | 			self.proxy = proxy | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 		try: | 
					
						
							|  |  |  | 			self.rrev = self.proxy.head(self.file) | 
					
						
							|  |  |  | 		except (os.error, IOError): | 
					
						
							|  |  |  | 			self.rrev = None | 
					
						
							|  |  |  | 		if self.rrev: | 
					
						
							|  |  |  | 			self.rsum = self.proxy.sum(self.file) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		else: | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 			self.rsum = None | 
					
						
							|  |  |  | 		if self.eseen: | 
					
						
							|  |  |  | 			self.getesum() | 
					
						
							|  |  |  | 		self.rseen = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def getesum(self): | 
					
						
							|  |  |  | 		if self.erev == self.rrev: | 
					
						
							|  |  |  | 			self.esum = self.rsum | 
					
						
							|  |  |  | 		elif self.erev: | 
					
						
							|  |  |  | 			name = (self.file, self.erev) | 
					
						
							|  |  |  | 			self.esum = self.proxy.sum(name) | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			self.esum = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def putentry(self): | 
					
						
							|  |  |  | 		"""Return a line suitable for inclusion in CVS/Entries.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		The returned line is terminated by a newline. | 
					
						
							|  |  |  | 		If no entry should be written for this file, | 
					
						
							|  |  |  | 		return "". | 
					
						
							|  |  |  | 		"""
 | 
					
						
							|  |  |  | 		if not self.eseen: | 
					
						
							|  |  |  | 			return "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		rev = self.erev or '0' | 
					
						
							|  |  |  | 		if self.edeleted: | 
					
						
							|  |  |  | 			rev = '-' + rev | 
					
						
							|  |  |  | 		if self.enew: | 
					
						
							|  |  |  | 			dates = 'Initial ' + self.file | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			dates = gmctime(self.ectime) + ' ' + \ | 
					
						
							|  |  |  | 				gmctime(self.emtime) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		return "/%s/%s/%s/%s/\n" % ( | 
					
						
							|  |  |  | 			self.file, | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 			rev, | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 			dates, | 
					
						
							|  |  |  | 			self.extra) | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	def report(self): | 
					
						
							|  |  |  | 		print '-'*50 | 
					
						
							|  |  |  | 		def r(key, repr=repr, self=self): | 
					
						
							|  |  |  | 			try: | 
					
						
							|  |  |  | 				value = repr(getattr(self, key)) | 
					
						
							|  |  |  | 			except AttributeError: | 
					
						
							|  |  |  | 				value = "?" | 
					
						
							|  |  |  | 			print "%-15s:" % key, value | 
					
						
							|  |  |  | 		r("file") | 
					
						
							|  |  |  | 		if self.lseen: | 
					
						
							|  |  |  | 			r("lsum", hexify) | 
					
						
							|  |  |  | 			r("lctime", gmctime) | 
					
						
							|  |  |  | 			r("lmtime", gmctime) | 
					
						
							|  |  |  | 		if self.eseen: | 
					
						
							|  |  |  | 			r("erev") | 
					
						
							| 
									
										
										
										
											1995-04-28 14:33:08 +00:00
										 |  |  | 			r("enew") | 
					
						
							|  |  |  | 			r("edeleted") | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 			r("ectime", gmctime) | 
					
						
							|  |  |  | 			r("emtime", gmctime) | 
					
						
							|  |  |  | 		if self.rseen: | 
					
						
							|  |  |  | 			r("rrev") | 
					
						
							|  |  |  | 			r("rsum", hexify) | 
					
						
							|  |  |  | 			if self.eseen: | 
					
						
							|  |  |  | 				r("esum", hexify) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class CVS: | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	"""Represent the contents of a CVS admin file (and more).
 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	Class variables: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	FileClass -- the class to be instantiated for entries | 
					
						
							|  |  |  | 	             (this should be derived from class File above) | 
					
						
							|  |  |  | 	IgnoreList -- shell patterns for local files to be ignored | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Instance variables: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	entries -- a dictionary containing File instances keyed by | 
					
						
							|  |  |  | 	           their file name | 
					
						
							|  |  |  | 	proxy -- an RCSProxy instance, or None | 
					
						
							|  |  |  | 	"""
 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	FileClass = File | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	IgnoreList = ['.*', '@*', ',*', '*~', '*.o', '*.a', '*.so', '*.pyc'] | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def __init__(self): | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 		self.entries = {} | 
					
						
							|  |  |  | 		self.proxy = None | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def setproxy(self, proxy): | 
					
						
							|  |  |  | 		if proxy is self.proxy: | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		self.proxy = proxy | 
					
						
							|  |  |  | 		for e in self.entries.values(): | 
					
						
							|  |  |  | 			e.rseen = 0 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	def getentries(self): | 
					
						
							|  |  |  | 		"""Read the contents of CVS/Entries""" | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		self.entries = {} | 
					
						
							|  |  |  | 		f = self.cvsopen("Entries") | 
					
						
							|  |  |  | 		while 1: | 
					
						
							|  |  |  | 			line = f.readline() | 
					
						
							|  |  |  | 			if not line: break | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 			e = self.FileClass() | 
					
						
							|  |  |  | 			e.getentry(line) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 			self.entries[e.file] = e | 
					
						
							|  |  |  | 		f.close() | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	def putentries(self): | 
					
						
							|  |  |  | 		"""Write CVS/Entries back""" | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		f = self.cvsopen("Entries", 'w') | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 		for e in self.values(): | 
					
						
							| 
									
										
										
										
											1995-04-28 15:25:44 +00:00
										 |  |  | 			f.write(e.putentry()) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		f.close() | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	def getlocalfiles(self): | 
					
						
							|  |  |  | 		list = self.entries.keys() | 
					
						
							|  |  |  | 		addlist = os.listdir(os.curdir) | 
					
						
							|  |  |  | 		for name in addlist: | 
					
						
							|  |  |  | 			if name in list: | 
					
						
							|  |  |  | 				continue | 
					
						
							|  |  |  | 			if not self.ignored(name): | 
					
						
							|  |  |  | 				list.append(name) | 
					
						
							|  |  |  | 		list.sort() | 
					
						
							|  |  |  | 		for file in list: | 
					
						
							|  |  |  | 			try: | 
					
						
							|  |  |  | 				e = self.entries[file] | 
					
						
							|  |  |  | 			except KeyError: | 
					
						
							|  |  |  | 				e = self.entries[file] = self.FileClass(file) | 
					
						
							|  |  |  | 			e.getlocal() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def getremotefiles(self, proxy = None): | 
					
						
							|  |  |  | 		if proxy: | 
					
						
							|  |  |  | 			self.proxy = proxy | 
					
						
							|  |  |  | 		if not self.proxy: | 
					
						
							|  |  |  | 			raise RuntimeError, "no RCS proxy" | 
					
						
							|  |  |  | 		addlist = self.proxy.listfiles() | 
					
						
							|  |  |  | 		for file in addlist: | 
					
						
							|  |  |  | 			try: | 
					
						
							|  |  |  | 				e = self.entries[file] | 
					
						
							|  |  |  | 			except KeyError: | 
					
						
							|  |  |  | 				e = self.entries[file] = self.FileClass(file) | 
					
						
							|  |  |  | 			e.getremote(self.proxy) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def report(self): | 
					
						
							|  |  |  | 		for e in self.values(): | 
					
						
							|  |  |  | 			e.report() | 
					
						
							|  |  |  | 		print '-'*50 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	def keys(self): | 
					
						
							|  |  |  | 		keys = self.entries.keys() | 
					
						
							|  |  |  | 		keys.sort() | 
					
						
							|  |  |  | 		return keys | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	def values(self): | 
					
						
							|  |  |  | 		def value(key, self=self): | 
					
						
							|  |  |  | 			return self.entries[key] | 
					
						
							|  |  |  | 		return map(value, self.keys()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	def items(self): | 
					
						
							|  |  |  | 		def item(key, self=self): | 
					
						
							|  |  |  | 			return (key, self.entries[key]) | 
					
						
							|  |  |  | 		return map(item, self.keys()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	def cvsexists(self, file): | 
					
						
							|  |  |  | 		file = os.path.join("CVS", file) | 
					
						
							|  |  |  | 		return os.path.exists(file) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def cvsopen(self, file, mode = 'r'): | 
					
						
							|  |  |  | 		file = os.path.join("CVS", file) | 
					
						
							|  |  |  | 		if 'r' not in mode: | 
					
						
							|  |  |  | 			self.backup(file) | 
					
						
							|  |  |  | 		return open(file, mode) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	def backup(self, file): | 
					
						
							|  |  |  | 		if os.path.isfile(file): | 
					
						
							|  |  |  | 			bfile = file + '~' | 
					
						
							| 
									
										
										
										
											1995-10-07 19:25:25 +00:00
										 |  |  | 			try: os.unlink(bfile) | 
					
						
							|  |  |  | 			except os.error: pass | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 			os.rename(file, bfile) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	def ignored(self, file): | 
					
						
							|  |  |  | 		if os.path.isdir(file): return 1 | 
					
						
							|  |  |  | 		for pat in self.IgnoreList: | 
					
						
							|  |  |  | 			if fnmatch.fnmatch(file, pat): return 1 | 
					
						
							|  |  |  | 		return 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # hexify and unhexify are useful to print MD5 checksums in hex format | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | hexify_format = '%02x' * 16 | 
					
						
							|  |  |  | def hexify(sum): | 
					
						
							|  |  |  | 	"Return a hex representation of a 16-byte string (e.g. an MD5 digest)" | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	if sum is None: | 
					
						
							|  |  |  | 		return "None" | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	return hexify_format % tuple(map(ord, sum)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def unhexify(hexsum): | 
					
						
							|  |  |  | 	"Return the original from a hexified string" | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	if hexsum == "None": | 
					
						
							|  |  |  | 		return None | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	sum = '' | 
					
						
							|  |  |  | 	for i in range(0, len(hexsum), 2): | 
					
						
							|  |  |  | 		sum = sum + chr(string.atoi(hexsum[i:i+2], 16)) | 
					
						
							|  |  |  | 	return sum | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | unctime_monthmap = {} | 
					
						
							|  |  |  | def unctime(date): | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	if date == "None": return None | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	if not unctime_monthmap: | 
					
						
							|  |  |  | 		months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', | 
					
						
							|  |  |  | 			  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] | 
					
						
							|  |  |  | 		i = 0 | 
					
						
							|  |  |  | 		for m in months: | 
					
						
							|  |  |  | 			i = i+1 | 
					
						
							|  |  |  | 			unctime_monthmap[m] = i | 
					
						
							|  |  |  | 	words = string.split(date) # Day Mon DD HH:MM:SS YEAR | 
					
						
							|  |  |  | 	year = string.atoi(words[4]) | 
					
						
							|  |  |  | 	month = unctime_monthmap[words[1]] | 
					
						
							|  |  |  | 	day = string.atoi(words[2]) | 
					
						
							|  |  |  | 	[hh, mm, ss] = map(string.atoi, string.splitfields(words[3], ':')) | 
					
						
							|  |  |  | 	ss = ss - time.timezone | 
					
						
							|  |  |  | 	return time.mktime((year, month, day, hh, mm, ss, 0, 0, 0)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def gmctime(t): | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	if t is None: return "None" | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	return time.asctime(time.gmtime(t)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test_unctime(): | 
					
						
							|  |  |  | 	now = int(time.time()) | 
					
						
							|  |  |  | 	t = time.gmtime(now) | 
					
						
							|  |  |  | 	at = time.asctime(t) | 
					
						
							|  |  |  | 	print 'GMT', now, at | 
					
						
							|  |  |  | 	print 'timezone', time.timezone | 
					
						
							|  |  |  | 	print 'local', time.ctime(now) | 
					
						
							|  |  |  | 	u = unctime(at) | 
					
						
							|  |  |  | 	print 'unctime()', u | 
					
						
							|  |  |  | 	gu = time.gmtime(u) | 
					
						
							|  |  |  | 	print '->', gu | 
					
						
							|  |  |  | 	print time.asctime(gu) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def test(): | 
					
						
							|  |  |  | 	x = CVS() | 
					
						
							| 
									
										
										
										
											1995-04-27 21:24:16 +00:00
										 |  |  | 	x.getentries() | 
					
						
							|  |  |  | 	x.getlocalfiles() | 
					
						
							|  |  |  | ##	x.report() | 
					
						
							|  |  |  | 	import rcsclient | 
					
						
							|  |  |  | 	proxy = rcsclient.openrcsclient() | 
					
						
							|  |  |  | 	x.getremotefiles(proxy) | 
					
						
							|  |  |  | 	x.report() | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  | 	test() |