# HG changeset patch # User Marcin Kuzminski # Date 1302016607 -7200 # Node ID 68e34f5cf12292098b367acb8718fba0cc89f13b # Parent 50e41777675dd62e4f93ba60268beca4f27e9d62 #150 fixes for errors on repositories mapped in db but corrupted in filesystem diff -r 50e41777675d -r 68e34f5cf122 docs/changelog.rst --- a/docs/changelog.rst Tue Apr 05 13:12:38 2011 +0200 +++ b/docs/changelog.rst Tue Apr 05 17:16:47 2011 +0200 @@ -16,7 +16,7 @@ - implemented #91 added nicer looking archive urls with more download options like tags, branches - implemented #44 into file browsing, and added follow branch option -- implemented #84 downloads can be enabled/disabled for each repository +- implemented #84 downloads can be enabled/disabled for each repository - anonymous repository can be cloned without having to pass default:default into clone url - fixed #90 whoosh indexer can index chooses repositories passed in command @@ -50,6 +50,7 @@ - fixed strange issue on formencode imports - fixed #126 Deleting repository on Windows, rename used incompatible chars. - windows fixes for os.kill and path spliting, issues #148 and #133 +- #150 fixes for errors on repositories mapped in db but corrupted in filesystem 1.1.7 (**2011-03-23**) ====================== diff -r 50e41777675d -r 68e34f5cf122 rhodecode/model/scm.py --- a/rhodecode/model/scm.py Tue Apr 05 13:12:38 2011 +0200 +++ b/rhodecode/model/scm.py Tue Apr 05 17:16:47 2011 +0200 @@ -61,6 +61,7 @@ def __repr__(self): return "<%s('id:%s')>" % (self.__class__.__name__, self.user_id) + class RepoTemp(object): def __init__(self, repo_id): self.repo_id = repo_id @@ -68,6 +69,7 @@ def __repr__(self): return "<%s('id:%s')>" % (self.__class__.__name__, self.repo_id) + class ScmModel(BaseModel): """Generic Scm Model """ @@ -98,7 +100,7 @@ for name, path in get_filesystem_repos(repos_path, recursive=True): try: - if repos_list.has_key(name): + if name in repos_list: raise RepositoryError('Duplicate repository name %s ' 'found in %s' % (name, path)) else: @@ -116,8 +118,8 @@ return repos_list def get_repos(self, all_repos=None): - """Get all repos from db and for each repo create it's backend instance. - and fill that backed with information from database + """Get all repos from db and for each repo create it's + backend instance and fill that backed with information from database :param all_repos: give specific repositories list, good for filtering this have to be a list of just the repository names @@ -137,6 +139,9 @@ if r_dbr is not None: repo, dbrepo = r_dbr + if not repo and dbrepo: + log.error('Repository %s looks somehow corrupted', r_name) + continue last_change = repo.last_change tip = h.get_changeset_safe(repo, 'tip') @@ -146,7 +151,8 @@ tmp_d['description'] = dbrepo.description tmp_d['description_sort'] = tmp_d['description'] tmp_d['last_change'] = last_change - tmp_d['last_change_sort'] = time.mktime(last_change.timetuple()) + tmp_d['last_change_sort'] = time.mktime(last_change \ + .timetuple()) tmp_d['tip'] = tip.raw_id tmp_d['tip_sort'] = tip.revision tmp_d['rev'] = tip.revision @@ -157,7 +163,8 @@ tmp_d['last_msg'] = tip.message tmp_d['repo'] = repo tmp_d['dbrepo'] = dbrepo.get_dict() - tmp_d['dbrepo_fork'] = dbrepo.fork.get_dict() if dbrepo.fork else {} + tmp_d['dbrepo_fork'] = dbrepo.fork.get_dict() if dbrepo.fork \ + else {} yield tmp_d def get(self, repo_name, invalidation_list=None, retval='all'): @@ -228,7 +235,6 @@ dbr = RepoModel().get_full(repo_name, cache=True, invalidate=dbinvalidate) - return r, dbr def mark_for_invalidation(self, repo_name): @@ -256,7 +262,6 @@ log.error(traceback.format_exc()) self.sa.rollback() - def toggle_following_repo(self, follow_repo_id, user_id): f = self.sa.query(UserFollowing)\ @@ -277,7 +282,6 @@ self.sa.rollback() raise - try: f = UserFollowing() f.user_id = user_id @@ -292,7 +296,7 @@ self.sa.rollback() raise - def toggle_following_user(self, follow_user_id , user_id): + def toggle_following_user(self, follow_user_id, user_id): f = self.sa.query(UserFollowing)\ .filter(UserFollowing.follows_user_id == follow_user_id)\ .filter(UserFollowing.user_id == user_id).scalar() @@ -355,15 +359,14 @@ .filter(Repository.fork \ == RepoModel().get_by_repo_name(repo_id)).count() - def pull_changes(self, repo_name, username): repo, dbrepo = self.get(repo_name, retval='all') try: - extras = {'ip':'', - 'username':username, - 'action':'push_remote', - 'repository':repo_name} + extras = {'ip': '', + 'username': username, + 'action': 'push_remote', + 'repository': repo_name} #inject ui extra param to log this action via push logger for k, v in extras.items(): @@ -378,7 +381,6 @@ def get_unread_journal(self): return self.sa.query(UserLog).count() - def _should_invalidate(self, repo_name): """Looks up database for invalidation signals for this repo_name