commitsdb.py

changeset 123
aeb0d0788869
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commitsdb.py	Sun Apr 19 19:45:42 2015 +0300
@@ -0,0 +1,84 @@
+class CommitsDb (object):
+	def __init__(self):
+		needNew = not os.path.isfile ('commits.db')
+		self.db = sqlite3.connect ('commits.db')
+
+		if needNew:
+			self.create_new()
+
+	def create_new (self):
+		self.db.executescript ('''
+			DROP TABLE IF EXISTS COMMITS;
+			DROP TABLE IF EXISTS REPOS;
+			DROP TABLE IF EXISTS REPOCOMMITS;
+			CREATE TABLE IF NOT EXISTS COMMITS
+			(
+				Node        text NOT NULL,
+				Dateversion text NOT NULL,
+				PRIMARY KEY (Node)
+			);
+			CREATE TABLE IF NOT EXISTS REPOS
+			(
+				Name     text NOT NULL,
+				PRIMARY KEY (Name)
+			);
+			CREATE TABLE IF NOT EXISTS REPOCOMMITS
+			(
+				Reponame text,
+				Node     text,
+				FOREIGN KEY (Reponame) REFERENCES REPOS(Name),
+				FOREIGN KEY (Node) REFERENCES COMMITS(Node)
+			);
+		''')
+
+		print 'Building commits.db...'
+		for repo in all_repo_names():
+			print 'Adding commits from %s...' % repo
+
+			data = subprocess.check_output (['hg', '--cwd', repo, 'log', '--template',
+				'{node} {date|hgdate}\n']).splitlines()
+
+			for line in data:
+				changeset, timestamp, tz = line.split(' ')
+				self.add_commit (repo, changeset, int (timestamp))
+
+		self.commit()
+
+	def add_commit (self, repo, changeset, timestamp):
+		dateversion = datetime.utcfromtimestamp (timestamp).strftime ('%y%m%d-%H%M')
+		self.db.execute ('''
+			INSERT OR IGNORE INTO REPOS
+			VALUES (?)
+		''', (repo,))
+
+		self.db.execute ('''
+			INSERT OR IGNORE INTO COMMITS
+			VALUES (?, ?)
+		''', (changeset, dateversion))
+
+		self.db.execute ('''
+			INSERT INTO REPOCOMMITS 
+			VALUES (?, ?)
+		''', (repo, changeset))
+
+	def get_commit_repos (self, node):
+		cursor = self.db.execute ('''
+			SELECT Reponame
+			FROM REPOCOMMITS
+			WHERE Node LIKE ?
+		''', (node + '%',))
+
+		results = cursor.fetchall()
+		return list (set (zip (*results)[0])) if results else []
+
+	def find_commit_by_dateversion (self, dateversion):
+		cursor = self.db.execute ('''
+			SELECT Node
+			FROM COMMITS
+			WHERE Dateversion = ?
+		''', (dateversion,))
+		result = cursor.fetchone()
+		return result[0] if result else None
+
+	def commit(self):
+		self.db.commit()
\ No newline at end of file

mercurial