Sun, 19 Apr 2015 19:45:42 +0300
- added commits.db and mercurial support restructure
- added new, from-scratch calculator for .calc
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()