--- /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