Return to loginfo-handler CVS log | Up to [RizwankCVS] / geekymedia_web / viewcvs |
File: [RizwankCVS] / geekymedia_web / viewcvs / loginfo-handler
(download)
Revision: 1.1.1.1 (vendor branch), Sat Feb 12 13:10:06 2005 UTC (19 years, 3 months ago) by rizwank Branch: rizwank, MAIN CVS Tags: start, HEAD Changes since 1.1: +0 -0 lines Imported source/web tree |
#!/usr/bin/python # -*- Mode: python -*- # # Copyright (C) 2000 The ViewCVS Group. All Rights Reserved. # # By using this file, you agree to the terms and conditions set forth in # the LICENSE.html file which can be found at the top level of the ViewCVS # distribution or at http://www.lyra.org/viewcvs/license-1.html. # # Contact information: # Greg Stein, PO Box 760, Palo Alto, CA, 94302 # gstein@lyra.org, http://www.lyra.org/viewcvs/ # # ----------------------------------------------------------------------- # # updates SQL database with new commit records # # ----------------------------------------------------------------------- # ######################################################################### # # INSTALL-TIME CONFIGURATION # # These values will be set during the installation process. During # development, they will remain None. # LIBRARY_DIR = "/home/rizwank/geekymedia.com/viewcvs/lib" CONF_PATHNAME = "/home/rizwank/geekymedia.com/viewcvs/viewcvs.conf" # Adjust sys.path to include our library directory import sys if LIBRARY_DIR: sys.path.insert(0, LIBRARY_DIR) else: sys.path[:0] = ['../lib'] # any other places to look? ######################################################################### import os import string import getopt import re import cvsdb import rlog import config DEBUG_FLAG = 0 ## pre-compiled regular expressions _re_fileversion = re.compile("([^,]+)\,([^,]+)\,([^,]+)") ## output functions def debug(text): if DEBUG_FLAG: print 'DEBUG(loginfo): %s' % (text) def warning(text): print 'WARNING(loginfo): %s' % (text) def error(text): print 'ERROR(loginfo): %s' % (text) sys.exit(1) class FileData: def __init__(self, file, directory, old_version, new_version): self.file = file self.directory = directory self.old_version = old_version self.new_version = new_version ## set the state of this file from the ## old_version and new_version information if self.old_version == 'NONE': self.ctype = "added" elif self.new_version == 'NONE': self.ctype = "removed" else: self.ctype = "changed" def CommitFromFileData(cfg, repository, file_data): ## construct the full path for the RCS file filename = os.path.join(repository, file_data.directory, file_data.file) ## get the 'rlog' output for just this revision, and then convert ## to a commit object rlog_data = rlog.GetRLogData(cfg, filename, file_data.new_version) commit_list = cvsdb.RLogDataToCommitList(repository, rlog_data) commit = commit_list[0] ## set the type of commit from the file_data setting if file_data.ctype == "changed": commit.SetTypeChange() elif file_data.ctype == "added": commit.SetTypeAdd() elif file_data.ctype == "removed": commit.SetTypeRemove() return commit def GetUnrecordedCommitList(repository, file_data): filename = os.path.join(repository, file_data.directory, file_data.file) return cvsdb.GetUnrecordedCommitList(repository, filename) def ProcessLoginfo(repository, stdin_list): ## XXX This is a somewhat dirty hack: ## cvsdb already loads the configuration file and provides a cfg ## instance. Pick it from there in order to be able to pass it down ## to rlog (see below). cfg = cvsdb.cfg ## the first line in stdin is a space-separated list; the first ## item in the list is the directory path being updated this run; ## the rest of the items are the files being updated list = string.split(stdin_list[0]) ## clean up the directory the following way: we don't want it ## to begin with a path seperator, and we don't want it to end ## with a path seperator directory = list[0] while directory[0] == os.sep: directory = directory[1:] while directory[-1] == os.sep: directory = directory[:-1] ## NOTE: SPECIAL HANDLING FOR NEW DIRECTORIES ## new directories have the first line form ## path/of/dir - New directory if len(list) == 4: if list[1] == '-' and list[2] == 'New' and list[3] == 'directory': debug('new directory') return ## each file in the file list _should_ be of the form: ## file-name,<old-ver>,<new-ver> ## a new file has the keyword 'NONE' for old-ver file_data_list = [] for item in list[1:]: temp = _re_fileversion.match(item) if not temp: debug('failed match %s' % (item)) continue filename = temp.group(1) old_version = temp.group(2) new_version = temp.group(3) file_data = FileData(filename, directory, old_version, new_version) file_data_list.append(file_data) ## convert FileData objects into Commit objects so we can insert them ## into the database commit_list = [] for file_data in file_data_list: ## XXX: this is nasty: in the case of a removed file, we are not ## given enough information to find it in the rlog output! ## So instead, we rlog everything in the removed file, and ## add any commits not already in the database if file_data.ctype == "removed": temp = GetUnrecordedCommitList(repository, file_data) commit_list = commit_list + temp else: commit_list.append(CommitFromFileData(cfg, repository, file_data)) ## add to the database db = cvsdb.ConnectDatabase() db.AddCommitList(commit_list) ## MAIN if __name__ == '__main__': ## get the repository from the environment try: repository = os.environ['CVSROOT'] except KeyError: error('CVSROOT not in environment') ## clean up the repository string: remove any trailing path seperater while repository[-1] == os.sep: repository = repository[:-1] ## read all the lines from stdin stdin_list = [] for line in sys.stdin.readlines(): stdin_list.append(string.rstrip(line)) ProcessLoginfo(repository, stdin_list) sys.exit(0)
Rizwan Kassim |
Powered by ViewCVS 0.9.2 |