Changeset - ca2b21819dfd
[Not reviewed]
beta
0 8 1
Marcin Kuzminski - 13 years ago 2012-12-05 23:59:13
marcin@python-works.com
Implemented better support for Wildcard queries
add username column to journal for caching logs after user deletion
added tests for admin journal
migrations
9 files changed with 2185 insertions and 28 deletions:
0 comments (0 inline, 0 general)
rhodecode/controllers/admin/admin.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
"""
 
    rhodecode.controllers.admin.admin
 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

	
 
    Controller for Admin panel of Rhodecode
 

	
 
    :created_on: Apr 7, 2010
 
    :author: marcink
 
    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
 
    :license: GPLv3, see COPYING for more details.
 
"""
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 

	
 
import logging
 

	
 
from pylons import request, tmpl_context as c, url
 
from sqlalchemy.orm import joinedload
 
from webhelpers.paginate import Page
 
from whoosh.qparser.default import QueryParser
 
from whoosh import query
 
from sqlalchemy.sql.expression import or_
 

	
 
from rhodecode.lib.auth import LoginRequired, HasPermissionAllDecorator
 
from rhodecode.lib.base import BaseController, render
 
from rhodecode.model.db import UserLog, User
 
from rhodecode.lib.utils2 import safe_int, remove_prefix
 
from rhodecode.lib.utils2 import safe_int, remove_prefix, remove_suffix
 
from rhodecode.lib.indexers import JOURNAL_SCHEMA
 

	
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
def _filter(user_log, search_term):
 
    """
 
    Filters sqlalchemy user_log based on search_term with whoosh Query language
 
    http://packages.python.org/Whoosh/querylang.html
 

	
 
    :param user_log:
 
    :param search_term:
 
    """
 
    log.debug('Initial search term: %r' % search_term)
 
    qry = None
 
    if search_term:
 
        qp = QueryParser('repository', schema=JOURNAL_SCHEMA)
 
        qry = qp.parse(unicode(search_term))
 
        log.debug('Filtering using query %r' % qry)
 
        log.debug('Filtering using parsed query %r' % qry)
 

	
 
    def wildcard_handler(col, wc_term):
 
        if wc_term.startswith('*') and not wc_term.endswith('*'):
 
            #postfix == endswith
 
            wc_term = remove_prefix(wc_term, prefix='*')
 
            return getattr(col, 'endswith')(wc_term)
 
        elif wc_term.startswith('*') and wc_term.endswith('*'):
 
            #wildcard == ilike
 
            wc_term = remove_prefix(wc_term, prefix='*')
 
            wc_term = remove_suffix(wc_term, suffix='*')
 
            return getattr(col, 'contains')(wc_term)
 

	
 
    def get_filterion(field, val, term):
 

	
 
        if field == 'repository':
 
            field = getattr(UserLog, 'repository_name')
 
        elif field == 'ip':
 
            field = getattr(UserLog, 'user_ip')
 
        elif field == 'date':
 
            field = getattr(UserLog, 'action_date')
 
        elif field == 'username':
 
            ##special case for username
 
            if isinstance(term, query.Wildcard):
 
                #only support wildcards with * at beggining
 
                val = remove_prefix(val, prefix='*')
 
                return getattr(UserLog, 'user_id').in_(
 
                    [x.user_id for x in
 
                     User.query().filter(User.username.endswith(val))])
 
            elif isinstance(term, query.Prefix):
 
                return getattr(UserLog, 'user_id').in_(
 
                    [x.user_id for x in
 
                     User.query().filter(User.username.startswith(val))])
 
            # term == exact match, case insensitive
 
            field = getattr(UserLog, 'user')
 
            val = User.get_by_username(val, case_insensitive=True)
 

	
 
            field = getattr(UserLog, 'username')
 
        else:
 
            field = getattr(UserLog, field)
 
        log.debug('filter field: %s val=>%s' % (field, val))
 

	
 
        #sql filtering
 
        if isinstance(term, query.Wildcard):
 
            return field.endsswith(val)
 
            return wildcard_handler(field, val)
 
        elif isinstance(term, query.Prefix):
 
            return field.startswith(val)
 
        return field == val
 

	
 
    if isinstance(qry, (query.And, query.Term, query.Prefix, query.Wildcard)):
 
        if not isinstance(qry, query.And):
 
            qry = [qry]
 
        for term in qry:
 
            field = term.fieldname
 
            val = term.text
 
            user_log = user_log.filter(get_filterion(field, val, term))
 
    elif isinstance(qry, query.Or):
 
        filters = []
 
        for term in qry:
 
            field = term.fieldname
 
            val = term.text
 
            if isinstance(term, query.Term):
 
                filters.append(get_filterion(field, val, term))
 
        user_log = user_log.filter(or_(*filters))
 

	
 
    return user_log
 

	
 

	
 
class AdminController(BaseController):
 

	
 
    @LoginRequired()
 
    def __before__(self):
 
        super(AdminController, self).__before__()
 

	
 
    @HasPermissionAllDecorator('hg.admin')
 
    def index(self):
 
        users_log = UserLog.query()\
 
                .options(joinedload(UserLog.user))\
 
                .options(joinedload(UserLog.repository))
 

	
 
        #FILTERING
 
        c.search_term = request.GET.get('filter')
 
        try:
 
            users_log = _filter(users_log, c.search_term)
 
        except:
 
            # we want this to crash for now
 
            raise
 

	
 
        users_log = users_log.order_by(UserLog.action_date.desc())
 

	
 
        p = safe_int(request.params.get('page', 1), 1)
 

	
 
        def url_generator(**kw):
 
            return url.current(filter=c.search_term, **kw)
 

	
 
        c.users_log = Page(users_log, page=p, items_per_page=10, url=url_generator)
 
        c.log_data = render('admin/admin_log.html')
 

	
 
        if request.environ.get('HTTP_X_PARTIAL_XHR'):
 
            return c.log_data
 
        return render('admin/admin.html')
rhodecode/lib/dbmigrate/versions/008_version_1_5_0.py
Show inline comments
 
import logging
 
import datetime
 

	
 
from sqlalchemy import *
 
from sqlalchemy.exc import DatabaseError
 
from sqlalchemy.orm import relation, backref, class_mapper
 
from sqlalchemy.orm import relation, backref, class_mapper, joinedload
 
from sqlalchemy.orm.session import Session
 
from sqlalchemy.ext.declarative import declarative_base
 

	
 
from rhodecode.lib.dbmigrate.migrate import *
 
from rhodecode.lib.dbmigrate.migrate.changeset import *
 

	
 
from rhodecode.model.meta import Base
 
from rhodecode.model import meta
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
def upgrade(migrate_engine):
 
    """
 
    Upgrade operations go here.
 
    Don't create your own engine; bind migrate_engine to your metadata
 
    """
 
    pass
 
    #==========================================================================
 
    # USER LOGS
 
    #==========================================================================
 
    from rhodecode.lib.dbmigrate.schema.db_1_5_0 import UserLog
 
    tbl = UserLog.__table__
 
    username = Column("username", String(255, convert_unicode=False,
 
                                         assert_unicode=None), nullable=True,
 
                      unique=None, default=None)
 
    # create username column
 
    username.create(table=tbl)
 

	
 
    ## after adding that column fix all usernames
 
    users_log = UserLog.query()\
 
            .options(joinedload(UserLog.user))\
 
            .options(joinedload(UserLog.repository)).all()
 
    for entry in users_log:
 
        entry.username = entry.user.username
 
        Session().add(entry)
 
    Session().commit()
 

	
 

	
 
def downgrade(migrate_engine):
 
    meta = MetaData()
 
    meta.bind = migrate_engine
rhodecode/lib/helpers.py
Show inline comments
 
"""Helper functions
 

	
 
Consists of functions to typically be used within templates, but also
 
available to Controllers. This module is available to both as 'h'.
 
"""
 
import random
 
import hashlib
 
import StringIO
 
import urllib
 
import math
 
import logging
 
import re
 
import urlparse
 

	
 
from datetime import datetime
 
from pygments.formatters.html import HtmlFormatter
 
from pygments import highlight as code_highlight
 
from pylons import url, request, config
 
from pylons.i18n.translation import _, ungettext
 
from hashlib import md5
 

	
 
from webhelpers.html import literal, HTML, escape
 
from webhelpers.html.tools import *
 
from webhelpers.html.builder import make_tag
 
from webhelpers.html.tags import auto_discovery_link, checkbox, css_classes, \
 
    end_form, file, form, hidden, image, javascript_link, link_to, \
 
    link_to_if, link_to_unless, ol, required_legend, select, stylesheet_link, \
 
    submit, text, password, textarea, title, ul, xml_declaration, radio
 
from webhelpers.html.tools import auto_link, button_to, highlight, \
 
    js_obfuscate, mail_to, strip_links, strip_tags, tag_re
 
from webhelpers.number import format_byte_size, format_bit_size
 
from webhelpers.pylonslib import Flash as _Flash
 
from webhelpers.pylonslib.secure_form import secure_form
 
from webhelpers.text import chop_at, collapse, convert_accented_entities, \
 
    convert_misc_entities, lchop, plural, rchop, remove_formatting, \
 
    replace_whitespace, urlify, truncate, wrap_paragraphs
 
from webhelpers.date import time_ago_in_words
 
from webhelpers.paginate import Page
 
from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
 
    convert_boolean_attrs, NotGiven, _make_safe_id_component
 

	
 
from rhodecode.lib.annotate import annotate_highlight
 
from rhodecode.lib.utils import repo_name_slug
 
from rhodecode.lib.utils2 import str2bool, safe_unicode, safe_str, \
 
    get_changeset_safe, datetime_to_time, time_to_datetime, AttributeDict
 
from rhodecode.lib.markup_renderer import MarkupRenderer
 
from rhodecode.lib.vcs.exceptions import ChangesetDoesNotExistError
 
from rhodecode.lib.vcs.backends.base import BaseChangeset, EmptyChangeset
 
from rhodecode.config.conf import DATE_FORMAT, DATETIME_FORMAT
 
from rhodecode.model.changeset_status import ChangesetStatusModel
 
from rhodecode.model.db import URL_SEP, Permission
 

	
 
log = logging.getLogger(__name__)
 

	
 

	
 
html_escape_table = {
 
    "&": "&amp;",
 
    '"': "&quot;",
 
    "'": "&apos;",
 
    ">": "&gt;",
 
    "<": "&lt;",
 
}
 

	
 

	
 
def html_escape(text):
 
    """Produce entities within text."""
 
    return "".join(html_escape_table.get(c, c) for c in text)
 

	
 

	
 
def shorter(text, size=20):
 
    postfix = '...'
 
    if len(text) > size:
 
        return text[:size - len(postfix)] + postfix
 
    return text
 

	
 

	
 
def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
 
    """
 
    Reset button
 
    """
 
    _set_input_attrs(attrs, type, name, value)
 
    _set_id_attr(attrs, id, name)
 
    convert_boolean_attrs(attrs, ["disabled"])
 
    return HTML.input(**attrs)
 

	
 
reset = _reset
 
safeid = _make_safe_id_component
 

	
 

	
 
def FID(raw_id, path):
 
    """
 
    Creates a uniqe ID for filenode based on it's hash of path and revision
 
    it's safe to use in urls
 

	
 
    :param raw_id:
 
    :param path:
 
    """
 

	
 
    return 'C-%s-%s' % (short_id(raw_id), md5(safe_str(path)).hexdigest()[:12])
 

	
 

	
 
def get_token():
 
    """Return the current authentication token, creating one if one doesn't
 
    already exist.
 
    """
 
    token_key = "_authentication_token"
 
    from pylons import session
 
    if not token_key in session:
 
        try:
 
            token = hashlib.sha1(str(random.getrandbits(128))).hexdigest()
 
        except AttributeError:  # Python < 2.4
 
            token = hashlib.sha1(str(random.randrange(2 ** 128))).hexdigest()
 
        session[token_key] = token
 
        if hasattr(session, 'save'):
 
            session.save()
 
    return session[token_key]
 

	
 

	
 
class _GetError(object):
 
    """Get error from form_errors, and represent it as span wrapped error
 
    message
 

	
 
    :param field_name: field to fetch errors for
 
    :param form_errors: form errors dict
 
    """
 

	
 
    def __call__(self, field_name, form_errors):
 
        tmpl = """<span class="error_msg">%s</span>"""
 
        if form_errors and field_name in form_errors:
 
            return literal(tmpl % form_errors.get(field_name))
 

	
 
get_error = _GetError()
 

	
 

	
 
class _ToolTip(object):
 

	
 
    def __call__(self, tooltip_title, trim_at=50):
 
        """
 
        Special function just to wrap our text into nice formatted
 
        autowrapped text
 

	
 
        :param tooltip_title:
 
        """
 
        tooltip_title = escape(tooltip_title)
 
        tooltip_title = tooltip_title.replace('<', '&lt;').replace('>', '&gt;')
 
        return tooltip_title
 
tooltip = _ToolTip()
 

	
 

	
 
class _FilesBreadCrumbs(object):
 

	
 
    def __call__(self, repo_name, rev, paths):
 
        if isinstance(paths, str):
 
            paths = safe_unicode(paths)
 
        url_l = [link_to(repo_name, url('files_home',
 
                                        repo_name=repo_name,
 
                                        revision=rev, f_path=''),
 
                         class_='ypjax-link')]
 
        paths_l = paths.split('/')
 
        for cnt, p in enumerate(paths_l):
 
            if p != '':
 
                url_l.append(link_to(p,
 
                                     url('files_home',
 
                                         repo_name=repo_name,
 
                                         revision=rev,
 
                                         f_path='/'.join(paths_l[:cnt + 1])
 
                                         ),
 
                                     class_='ypjax-link'
 
                                     )
 
                             )
 

	
 
        return literal('/'.join(url_l))
 

	
 
files_breadcrumbs = _FilesBreadCrumbs()
 

	
 

	
 
class CodeHtmlFormatter(HtmlFormatter):
 
    """
 
    My code Html Formatter for source codes
 
    """
 

	
 
    def wrap(self, source, outfile):
 
        return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
 

	
 
    def _wrap_code(self, source):
 
        for cnt, it in enumerate(source):
 
            i, t = it
 
            t = '<div id="L%s">%s</div>' % (cnt + 1, t)
 
            yield i, t
 

	
 
    def _wrap_tablelinenos(self, inner):
 
        dummyoutfile = StringIO.StringIO()
 
        lncount = 0
 
        for t, line in inner:
 
            if t:
 
                lncount += 1
 
            dummyoutfile.write(line)
 

	
 
        fl = self.linenostart
 
        mw = len(str(lncount + fl - 1))
 
        sp = self.linenospecial
 
        st = self.linenostep
 
        la = self.lineanchors
 
        aln = self.anchorlinenos
 
        nocls = self.noclasses
 
        if sp:
 
            lines = []
 

	
 
            for i in range(fl, fl + lncount):
 
                if i % st == 0:
 
                    if i % sp == 0:
 
                        if aln:
 
                            lines.append('<a href="#%s%d" class="special">%*d</a>' %
 
                                         (la, i, mw, i))
 
                        else:
 
                            lines.append('<span class="special">%*d</span>' % (mw, i))
 
                    else:
 
                        if aln:
 
                            lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
 
                        else:
 
                            lines.append('%*d' % (mw, i))
 
                else:
 
                    lines.append('')
 
            ls = '\n'.join(lines)
 
        else:
 
            lines = []
 
            for i in range(fl, fl + lncount):
 
                if i % st == 0:
 
                    if aln:
 
                        lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
 
                    else:
 
                        lines.append('%*d' % (mw, i))
 
                else:
 
                    lines.append('')
 
            ls = '\n'.join(lines)
 

	
 
        # in case you wonder about the seemingly redundant <div> here: since the
 
        # content in the other cell also is wrapped in a div, some browsers in
 
        # some configurations seem to mess up the formatting...
 
        if nocls:
 
            yield 0, ('<table class="%stable">' % self.cssclass +
 
                      '<tr><td><div class="linenodiv" '
 
                      'style="background-color: #f0f0f0; padding-right: 10px">'
 
                      '<pre style="line-height: 125%">' +
 
                      ls + '</pre></div></td><td id="hlcode" class="code">')
 
        else:
 
            yield 0, ('<table class="%stable">' % self.cssclass +
 
                      '<tr><td class="linenos"><div class="linenodiv"><pre>' +
 
                      ls + '</pre></div></td><td id="hlcode" class="code">')
 
        yield 0, dummyoutfile.getvalue()
 
        yield 0, '</td></tr></table>'
 

	
 

	
 
def pygmentize(filenode, **kwargs):
 
    """pygmentize function using pygments
 

	
 
    :param filenode:
 
    """
 

	
 
    return literal(code_highlight(filenode.content,
 
                                  filenode.lexer, CodeHtmlFormatter(**kwargs)))
 

	
 

	
 
def pygmentize_annotation(repo_name, filenode, **kwargs):
 
    """
 
    pygmentize function for annotation
 

	
 
    :param filenode:
 
    """
 

	
 
    color_dict = {}
 

	
 
    def gen_color(n=10000):
 
        """generator for getting n of evenly distributed colors using
 
        hsv color and golden ratio. It always return same order of colors
 

	
 
        :returns: RGB tuple
 
        """
 

	
 
        def hsv_to_rgb(h, s, v):
 
            if s == 0.0:
 
                return v, v, v
 
            i = int(h * 6.0)  # XXX assume int() truncates!
 
            f = (h * 6.0) - i
 
            p = v * (1.0 - s)
 
            q = v * (1.0 - s * f)
 
            t = v * (1.0 - s * (1.0 - f))
 
            i = i % 6
 
            if i == 0:
 
                return v, t, p
 
            if i == 1:
 
                return q, v, p
 
            if i == 2:
 
                return p, v, t
 
            if i == 3:
 
                return p, q, v
 
            if i == 4:
 
                return t, p, v
 
            if i == 5:
 
                return v, p, q
 

	
 
        golden_ratio = 0.618033988749895
 
        h = 0.22717784590367374
 

	
 
        for _ in xrange(n):
 
            h += golden_ratio
 
            h %= 1
 
            HSV_tuple = [h, 0.95, 0.95]
 
            RGB_tuple = hsv_to_rgb(*HSV_tuple)
 
            yield map(lambda x: str(int(x * 256)), RGB_tuple)
 

	
 
    cgenerator = gen_color()
 

	
 
    def get_color_string(cs):
 
        if cs in color_dict:
 
            col = color_dict[cs]
 
        else:
 
            col = color_dict[cs] = cgenerator.next()
 
        return "color: rgb(%s)! important;" % (', '.join(col))
 

	
 
    def url_func(repo_name):
 

	
 
        def _url_func(changeset):
 
            author = changeset.author
 
            date = changeset.date
 
            message = tooltip(changeset.message)
 

	
 
            tooltip_html = ("<div style='font-size:0.8em'><b>Author:</b>"
 
                            " %s<br/><b>Date:</b> %s</b><br/><b>Message:"
 
                            "</b> %s<br/></div>")
 

	
 
            tooltip_html = tooltip_html % (author, date, message)
 
            lnk_format = '%5s:%s' % ('r%s' % changeset.revision,
 
                                     short_id(changeset.raw_id))
 
            uri = link_to(
 
                    lnk_format,
 
                    url('changeset_home', repo_name=repo_name,
 
                        revision=changeset.raw_id),
 
                    style=get_color_string(changeset.raw_id),
 
                    class_='tooltip',
 
                    title=tooltip_html
 
                  )
 

	
 
            uri += '\n'
 
            return uri
 
        return _url_func
 

	
 
    return literal(annotate_highlight(filenode, url_func(repo_name), **kwargs))
 

	
 

	
 
def is_following_repo(repo_name, user_id):
 
    from rhodecode.model.scm import ScmModel
 
    return ScmModel().is_following_repo(repo_name, user_id)
 

	
 
flash = _Flash()
 

	
 
#==============================================================================
 
# SCM FILTERS available via h.
 
#==============================================================================
 
from rhodecode.lib.vcs.utils import author_name, author_email
 
from rhodecode.lib.utils2 import credentials_filter, age as _age
 
from rhodecode.model.db import User, ChangesetStatus
 

	
 
age = lambda  x: _age(x)
 
capitalize = lambda x: x.capitalize()
 
email = author_email
 
short_id = lambda x: x[:12]
 
hide_credentials = lambda x: ''.join(credentials_filter(x))
 

	
 

	
 
def fmt_date(date):
 
    if date:
 
        _fmt = _(u"%a, %d %b %Y %H:%M:%S").encode('utf8')
 
        return date.strftime(_fmt).decode('utf8')
 

	
 
    return ""
 

	
 

	
 
def is_git(repository):
 
    if hasattr(repository, 'alias'):
 
        _type = repository.alias
 
    elif hasattr(repository, 'repo_type'):
 
        _type = repository.repo_type
 
    else:
 
        _type = repository
 
    return _type == 'git'
 

	
 

	
 
def is_hg(repository):
 
    if hasattr(repository, 'alias'):
 
        _type = repository.alias
 
    elif hasattr(repository, 'repo_type'):
 
        _type = repository.repo_type
 
    else:
 
        _type = repository
 
    return _type == 'hg'
 

	
 

	
 
def email_or_none(author):
 
    # extract email from the commit string
 
    _email = email(author)
 
    if _email != '':
 
        # check it against RhodeCode database, and use the MAIN email for this
 
        # user
 
        user = User.get_by_email(_email, case_insensitive=True, cache=True)
 
        if user is not None:
 
            return user.email
 
        return _email
 

	
 
    # See if it contains a username we can get an email from
 
    user = User.get_by_username(author_name(author), case_insensitive=True,
 
                                cache=True)
 
    if user is not None:
 
        return user.email
 

	
 
    # No valid email, not a valid user in the system, none!
 
    return None
 

	
 

	
 
def person(author, show_attr="username_and_name"):
 
    # attr to return from fetched user
 
    person_getter = lambda usr: getattr(usr, show_attr)
 

	
 
    # Valid email in the attribute passed, see if they're in the system
 
    _email = email(author)
 
    if _email != '':
 
        user = User.get_by_email(_email, case_insensitive=True, cache=True)
 
        if user is not None:
 
            return person_getter(user)
 
        return _email
 

	
 
    # Maybe it's a username?
 
    _author = author_name(author)
 
    user = User.get_by_username(_author, case_insensitive=True,
 
                                cache=True)
 
    if user is not None:
 
        return person_getter(user)
 

	
 
    # Still nothing?  Just pass back the author name then
 
    return _author
 

	
 

	
 
def person_by_id(id_, show_attr="username_and_name"):
 
    # attr to return from fetched user
 
    person_getter = lambda usr: getattr(usr, show_attr)
 

	
 
    #maybe it's an ID ?
 
    if str(id_).isdigit() or isinstance(id_, int):
 
        id_ = int(id_)
 
        user = User.get(id_)
 
        if user is not None:
 
            return person_getter(user)
 
    return id_
 

	
 

	
 
def desc_stylize(value):
 
    """
 
    converts tags from value into html equivalent
 

	
 
    :param value:
 
    """
 
    value = re.sub(r'\[see\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
 
                   '<div class="metatag" tag="see">see =&gt; \\1 </div>', value)
 
    value = re.sub(r'\[license\ \=\>\ *([a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\]',
 
                   '<div class="metatag" tag="license"><a href="http:\/\/www.opensource.org/licenses/\\1">\\1</a></div>', value)
 
    value = re.sub(r'\[(requires|recommends|conflicts|base)\ \=\>\ *([a-zA-Z\-\/]*)\]',
 
                   '<div class="metatag" tag="\\1">\\1 =&gt; <a href="/\\2">\\2</a></div>', value)
 
    value = re.sub(r'\[(lang|language)\ \=\>\ *([a-zA-Z\-\/\#\+]*)\]',
 
                   '<div class="metatag" tag="lang">\\2</div>', value)
 
    value = re.sub(r'\[([a-z]+)\]',
 
                  '<div class="metatag" tag="\\1">\\1</div>', value)
 

	
 
    return value
 

	
 

	
 
def bool2icon(value):
 
    """Returns True/False values represented as small html image of true/false
 
    icons
 

	
 
    :param value: bool value
 
    """
 

	
 
    if value is True:
 
        return HTML.tag('img', src=url("/images/icons/accept.png"),
 
                        alt=_('True'))
 

	
 
    if value is False:
 
        return HTML.tag('img', src=url("/images/icons/cancel.png"),
 
                        alt=_('False'))
 

	
 
    return value
 

	
 

	
 
def action_parser(user_log, feed=False, parse_cs=False):
 
    """
 
    This helper will action_map the specified string action into translated
 
    fancy names with icons and links
 

	
 
    :param user_log: user log instance
 
    :param feed: use output for feeds (no html and fancy icons)
 
    :param parse_cs: parse Changesets into VCS instances
 
    """
 

	
 
    action = user_log.action
 
    action_params = ' '
 

	
 
    x = action.split(':')
 

	
 
    if len(x) > 1:
 
        action, action_params = x
 

	
 
    def get_cs_links():
 
        revs_limit = 3  # display this amount always
 
        revs_top_limit = 50  # show upto this amount of changesets hidden
 
        revs_ids = action_params.split(',')
 
        deleted = user_log.repository is None
 
        if deleted:
 
            return ','.join(revs_ids)
 

	
 
        repo_name = user_log.repository.repo_name
 

	
 
        def lnk(rev, repo_name):
 
            if isinstance(rev, BaseChangeset) or isinstance(rev, AttributeDict):
 
                lazy_cs = True
 
                if getattr(rev, 'op', None) and getattr(rev, 'ref_name', None):
 
                    lazy_cs = False
 
                    lbl = '?'
 
                    if rev.op == 'delete_branch':
 
                        lbl = '%s' % _('Deleted branch: %s') % rev.ref_name
 
                        title = ''
 
                    elif rev.op == 'tag':
 
                        lbl = '%s' % _('Created tag: %s') % rev.ref_name
 
                        title = ''
 
                    _url = '#'
 

	
 
                else:
 
                    lbl = '%s' % (rev.short_id[:8])
 
                    _url = url('changeset_home', repo_name=repo_name,
 
                               revision=rev.raw_id)
 
                    title = tooltip(rev.message)
 
            else:
 
                ## changeset cannot be found/striped/removed etc.
 
                lbl = ('%s' % rev)[:12]
 
                _url = '#'
 
                title = _('Changeset not found')
 
            if parse_cs:
 
                return link_to(lbl, _url, title=title, class_='tooltip')
 
            return link_to(lbl, _url, raw_id=rev.raw_id, repo_name=repo_name,
 
                           class_='lazy-cs' if lazy_cs else '')
 

	
 
        revs = []
 
        if len(filter(lambda v: v != '', revs_ids)) > 0:
 
            repo = None
 
            for rev in revs_ids[:revs_top_limit]:
 
                _op = _name = None
 
                if len(rev.split('=>')) == 2:
 
                    _op, _name = rev.split('=>')
 

	
 
                # we want parsed changesets, or new log store format is bad
 
                if parse_cs:
 
                    try:
 
                        if repo is None:
 
                            repo = user_log.repository.scm_instance
 
                        _rev = repo.get_changeset(rev)
 
                        revs.append(_rev)
 
                    except ChangesetDoesNotExistError:
 
                        log.error('cannot find revision %s in this repo' % rev)
 
                        revs.append(rev)
 
                        continue
 
                else:
 
                    _rev = AttributeDict({
 
                        'short_id': rev[:12],
 
                        'raw_id': rev,
 
                        'message': '',
 
                        'op': _op,
 
                        'ref_name': _name
 
                    })
 
                    revs.append(_rev)
 
        cs_links = []
 
        cs_links.append(" " + ', '.join(
 
            [lnk(rev, repo_name) for rev in revs[:revs_limit]]
 
            )
 
        )
 

	
 
        compare_view = (
 
            ' <div class="compare_view tooltip" title="%s">'
 
            '<a href="%s">%s</a> </div>' % (
 
                _('Show all combined changesets %s->%s') % (
 
                    revs_ids[0][:12], revs_ids[-1][:12]
 
                ),
 
                url('changeset_home', repo_name=repo_name,
 
                    revision='%s...%s' % (revs_ids[0], revs_ids[-1])
 
                ),
 
                _('compare view')
 
            )
 
        )
 

	
 
        # if we have exactly one more than normally displayed
 
        # just display it, takes less space than displaying
 
        # "and 1 more revisions"
 
        if len(revs_ids) == revs_limit + 1:
 
            rev = revs[revs_limit]
 
            cs_links.append(", " + lnk(rev, repo_name))
 

	
 
        # hidden-by-default ones
 
        if len(revs_ids) > revs_limit + 1:
 
            uniq_id = revs_ids[0]
 
            html_tmpl = (
 
                '<span> %s <a class="show_more" id="_%s" '
 
                'href="#more">%s</a> %s</span>'
 
            )
 
            if not feed:
 
                cs_links.append(html_tmpl % (
 
                      _('and'),
 
                      uniq_id, _('%s more') % (len(revs_ids) - revs_limit),
 
                      _('revisions')
 
                    )
 
                )
 

	
 
            if not feed:
 
                html_tmpl = '<span id="%s" style="display:none">, %s </span>'
 
            else:
 
                html_tmpl = '<span id="%s"> %s </span>'
 

	
 
            morelinks = ', '.join(
 
              [lnk(rev, repo_name) for rev in revs[revs_limit:]]
 
            )
 

	
 
            if len(revs_ids) > revs_top_limit:
 
                morelinks += ', ...'
 

	
 
            cs_links.append(html_tmpl % (uniq_id, morelinks))
 
        if len(revs) > 1:
 
            cs_links.append(compare_view)
 
        return ''.join(cs_links)
 

	
 
    def get_fork_name():
 
        repo_name = action_params
 
        _url = url('summary_home', repo_name=repo_name)
 
        return _('fork name %s') % link_to(action_params, _url)
 

	
 
    def get_user_name():
 
        user_name = action_params
 
        return user_name
 

	
 
    def get_users_group():
 
        group_name = action_params
 
        return group_name
 

	
 
    def get_pull_request():
 
        pull_request_id = action_params
 
        deleted = user_log.repository is None
 
        if deleted:
 
            repo_name = user_log.repository_name
 
        else:
 
        repo_name = user_log.repository.repo_name
 
        return link_to(_('Pull request #%s') % pull_request_id,
 
                    url('pullrequest_show', repo_name=repo_name,
 
                    pull_request_id=pull_request_id))
 

	
 
    # action : translated str, callback(extractor), icon
 
    action_map = {
 
    'user_deleted_repo':           (_('[deleted] repository'),
 
                                    None, 'database_delete.png'),
 
    'user_created_repo':           (_('[created] repository'),
 
                                    None, 'database_add.png'),
 
    'user_created_fork':           (_('[created] repository as fork'),
 
                                    None, 'arrow_divide.png'),
 
    'user_forked_repo':            (_('[forked] repository'),
 
                                    get_fork_name, 'arrow_divide.png'),
 
    'user_updated_repo':           (_('[updated] repository'),
 
                                    None, 'database_edit.png'),
 
    'admin_deleted_repo':          (_('[delete] repository'),
 
                                    None, 'database_delete.png'),
 
    'admin_created_repo':          (_('[created] repository'),
 
                                    None, 'database_add.png'),
 
    'admin_forked_repo':           (_('[forked] repository'),
 
                                    None, 'arrow_divide.png'),
 
    'admin_updated_repo':          (_('[updated] repository'),
 
                                    None, 'database_edit.png'),
 
    'admin_created_user':          (_('[created] user'),
 
                                    get_user_name, 'user_add.png'),
 
    'admin_updated_user':          (_('[updated] user'),
 
                                    get_user_name, 'user_edit.png'),
 
    'admin_created_users_group':   (_('[created] users group'),
 
                                    get_users_group, 'group_add.png'),
 
    'admin_updated_users_group':   (_('[updated] users group'),
 
                                    get_users_group, 'group_edit.png'),
 
    'user_commented_revision':     (_('[commented] on revision in repository'),
 
                                    get_cs_links, 'comment_add.png'),
 
    'user_commented_pull_request': (_('[commented] on pull request for'),
 
                                    get_pull_request, 'comment_add.png'),
 
    'user_closed_pull_request':    (_('[closed] pull request for'),
 
                                    get_pull_request, 'tick.png'),
 
    'push':                        (_('[pushed] into'),
 
                                    get_cs_links, 'script_add.png'),
 
    'push_local':                  (_('[committed via RhodeCode] into repository'),
 
                                    get_cs_links, 'script_edit.png'),
 
    'push_remote':                 (_('[pulled from remote] into repository'),
 
                                    get_cs_links, 'connect.png'),
 
    'pull':                        (_('[pulled] from'),
 
                                    None, 'down_16.png'),
 
    'started_following_repo':      (_('[started following] repository'),
 
                                    None, 'heart_add.png'),
 
    'stopped_following_repo':      (_('[stopped following] repository'),
 
                                    None, 'heart_delete.png'),
 
    }
 

	
 
    action_str = action_map.get(action, action)
 
    if feed:
 
        action = action_str[0].replace('[', '').replace(']', '')
 
    else:
 
        action = action_str[0]\
 
            .replace('[', '<span class="journal_highlight">')\
 
            .replace(']', '</span>')
 

	
 
    action_params_func = lambda: ""
 

	
 
    if callable(action_str[1]):
 
        action_params_func = action_str[1]
 

	
 
    def action_parser_icon():
 
        action = user_log.action
 
        action_params = None
 
        x = action.split(':')
 

	
 
        if len(x) > 1:
 
            action, action_params = x
 

	
 
        tmpl = """<img src="%s%s" alt="%s"/>"""
 
        ico = action_map.get(action, ['', '', ''])[2]
 
        return literal(tmpl % ((url('/images/icons/')), ico, action))
 

	
 
    # returned callbacks we need to call to get
 
    return [lambda: literal(action), action_params_func, action_parser_icon]
 

	
 

	
 

	
 
#==============================================================================
 
# PERMS
 
#==============================================================================
 
from rhodecode.lib.auth import HasPermissionAny, HasPermissionAll, \
 
HasRepoPermissionAny, HasRepoPermissionAll
 

	
 

	
 
#==============================================================================
 
# GRAVATAR URL
 
#==============================================================================
 

	
 
def gravatar_url(email_address, size=30):
 
    from pylons import url  ## doh, we need to re-import url to mock it later
 
    if(str2bool(config['app_conf'].get('use_gravatar')) and
 
       config['app_conf'].get('alternative_gravatar_url')):
 
        tmpl = config['app_conf'].get('alternative_gravatar_url', '')
 
        parsed_url = urlparse.urlparse(url.current(qualified=True))
 
        tmpl = tmpl.replace('{email}', email_address)\
 
                   .replace('{md5email}', hashlib.md5(email_address.lower()).hexdigest()) \
 
                   .replace('{netloc}', parsed_url.netloc)\
 
                   .replace('{scheme}', parsed_url.scheme)\
 
                   .replace('{size}', str(size))
 
        return tmpl
 

	
 
    if (not str2bool(config['app_conf'].get('use_gravatar')) or
 
        not email_address or email_address == 'anonymous@rhodecode.org'):
 
        f = lambda a, l: min(l, key=lambda x: abs(x - a))
 
        return url("/images/user%s.png" % f(size, [14, 16, 20, 24, 30]))
 

	
 
    ssl_enabled = 'https' == request.environ.get('wsgi.url_scheme')
 
    default = 'identicon'
 
    baseurl_nossl = "http://www.gravatar.com/avatar/"
 
    baseurl_ssl = "https://secure.gravatar.com/avatar/"
 
    baseurl = baseurl_ssl if ssl_enabled else baseurl_nossl
 

	
 
    if isinstance(email_address, unicode):
 
        #hashlib crashes on unicode items
 
        email_address = safe_str(email_address)
 
    # construct the url
 
    gravatar_url = baseurl + hashlib.md5(email_address.lower()).hexdigest() + "?"
 
    gravatar_url += urllib.urlencode({'d': default, 's': str(size)})
 

	
 
    return gravatar_url
 

	
 

	
 
#==============================================================================
 
# REPO PAGER, PAGER FOR REPOSITORY
 
#==============================================================================
 
class RepoPage(Page):
 

	
 
    def __init__(self, collection, page=1, items_per_page=20,
 
                 item_count=None, url=None, **kwargs):
 

	
 
        """Create a "RepoPage" instance. special pager for paging
 
        repository
 
        """
 
        self._url_generator = url
 

	
 
        # Safe the kwargs class-wide so they can be used in the pager() method
 
        self.kwargs = kwargs
 

	
 
        # Save a reference to the collection
 
        self.original_collection = collection
 

	
 
        self.collection = collection
 

	
 
        # The self.page is the number of the current page.
 
        # The first page has the number 1!
 
        try:
 
            self.page = int(page)  # make it int() if we get it as a string
 
        except (ValueError, TypeError):
 
            self.page = 1
 

	
 
        self.items_per_page = items_per_page
 

	
 
        # Unless the user tells us how many items the collections has
 
        # we calculate that ourselves.
 
        if item_count is not None:
 
            self.item_count = item_count
 
        else:
 
            self.item_count = len(self.collection)
 

	
 
        # Compute the number of the first and last available page
 
        if self.item_count > 0:
 
            self.first_page = 1
 
            self.page_count = int(math.ceil(float(self.item_count) /
 
                                            self.items_per_page))
 
            self.last_page = self.first_page + self.page_count - 1
 

	
 
            # Make sure that the requested page number is the range of
 
            # valid pages
 
            if self.page > self.last_page:
 
                self.page = self.last_page
 
            elif self.page < self.first_page:
 
                self.page = self.first_page
 

	
 
            # Note: the number of items on this page can be less than
 
            #       items_per_page if the last page is not full
 
            self.first_item = max(0, (self.item_count) - (self.page *
 
                                                          items_per_page))
 
            self.last_item = ((self.item_count - 1) - items_per_page *
 
                              (self.page - 1))
 

	
 
            self.items = list(self.collection[self.first_item:self.last_item + 1])
 

	
 
            # Links to previous and next page
 
            if self.page > self.first_page:
 
                self.previous_page = self.page - 1
 
            else:
 
                self.previous_page = None
 

	
 
            if self.page < self.last_page:
 
                self.next_page = self.page + 1
 
            else:
 
                self.next_page = None
 

	
 
        # No items available
 
        else:
 
            self.first_page = None
 
            self.page_count = 0
 
            self.last_page = None
 
            self.first_item = None
 
            self.last_item = None
 
            self.previous_page = None
 
            self.next_page = None
 
            self.items = []
 

	
 
        # This is a subclass of the 'list' type. Initialise the list now.
 
        list.__init__(self, reversed(self.items))
 

	
 

	
 
def changed_tooltip(nodes):
 
    """
 
    Generates a html string for changed nodes in changeset page.
 
    It limits the output to 30 entries
 

	
 
    :param nodes: LazyNodesGenerator
 
    """
 
    if nodes:
 
        pref = ': <br/> '
 
        suf = ''
 
        if len(nodes) > 30:
 
            suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
 
        return literal(pref + '<br/> '.join([safe_unicode(x.path)
 
                                             for x in nodes[:30]]) + suf)
 
    else:
 
        return ': ' + _('No Files')
 

	
 

	
 
def repo_link(groups_and_repos, last_url=None):
 
    """
 
    Makes a breadcrumbs link to repo within a group
 
    joins &raquo; on each group to create a fancy link
 

	
 
    ex::
 
        group >> subgroup >> repo
 

	
 
    :param groups_and_repos:
 
    :param last_url:
 
    """
 
    groups, repo_name = groups_and_repos
 
    last_link = link_to(repo_name, last_url) if last_url else repo_name
 

	
 
    if not groups:
 
        if last_url:
 
            return last_link
 
        return repo_name
 
    else:
 
        def make_link(group):
 
            return link_to(group.name,
 
                           url('repos_group_home', group_name=group.group_name))
 
        return literal(' &raquo; '.join(map(make_link, groups) + [last_link]))
 

	
 

	
 
def fancy_file_stats(stats):
 
    """
 
    Displays a fancy two colored bar for number of added/deleted
 
    lines of code on file
 

	
 
    :param stats: two element list of added/deleted lines of code
 
    """
 
    def cgen(l_type, a_v, d_v):
 
        mapping = {'tr': 'top-right-rounded-corner-mid',
 
                   'tl': 'top-left-rounded-corner-mid',
 
                   'br': 'bottom-right-rounded-corner-mid',
 
                   'bl': 'bottom-left-rounded-corner-mid'}
 
        map_getter = lambda x: mapping[x]
 

	
 
        if l_type == 'a' and d_v:
 
            #case when added and deleted are present
 
            return ' '.join(map(map_getter, ['tl', 'bl']))
 

	
 
        if l_type == 'a' and not d_v:
 
            return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
 

	
 
        if l_type == 'd' and a_v:
 
            return ' '.join(map(map_getter, ['tr', 'br']))
 

	
 
        if l_type == 'd' and not a_v:
 
            return ' '.join(map(map_getter, ['tr', 'br', 'tl', 'bl']))
 

	
 
    a, d = stats[0], stats[1]
 
    width = 100
 

	
 
    if a == 'b':
 
        #binary mode
 
        b_d = '<div class="bin%s %s" style="width:100%%">%s</div>' % (d, cgen('a', a_v='', d_v=0), 'bin')
 
        b_a = '<div class="bin1" style="width:0%%">%s</div>' % ('bin')
 
        return literal('<div style="width:%spx">%s%s</div>' % (width, b_a, b_d))
 

	
 
    t = stats[0] + stats[1]
 
    unit = float(width) / (t or 1)
 

	
 
    # needs > 9% of width to be visible or 0 to be hidden
 
    a_p = max(9, unit * a) if a > 0 else 0
 
    d_p = max(9, unit * d) if d > 0 else 0
 
    p_sum = a_p + d_p
 

	
 
    if p_sum > width:
 
        #adjust the percentage to be == 100% since we adjusted to 9
 
        if a_p > d_p:
 
            a_p = a_p - (p_sum - width)
 
        else:
 
            d_p = d_p - (p_sum - width)
 

	
 
    a_v = a if a > 0 else ''
 
    d_v = d if d > 0 else ''
 

	
 
    d_a = '<div class="added %s" style="width:%s%%">%s</div>' % (
 
        cgen('a', a_v, d_v), a_p, a_v
 
    )
 
    d_d = '<div class="deleted %s" style="width:%s%%">%s</div>' % (
 
        cgen('d', a_v, d_v), d_p, d_v
 
    )
 
    return literal('<div style="width:%spx">%s%s</div>' % (width, d_a, d_d))
 

	
 

	
 
def urlify_text(text_):
 

	
 
    url_pat = re.compile(r'''(http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]'''
 
                         '''|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+)''')
 

	
 
    def url_func(match_obj):
 
        url_full = match_obj.groups()[0]
 
        return '<a href="%(url)s">%(url)s</a>' % ({'url': url_full})
 

	
 
    return literal(url_pat.sub(url_func, text_))
 

	
 

	
 
def urlify_changesets(text_, repository):
 
    """
 
    Extract revision ids from changeset and make link from them
 

	
 
    :param text_:
 
    :param repository:
 
    """
 

	
 
    URL_PAT = re.compile(r'([0-9a-fA-F]{12,})')
 

	
 
    def url_func(match_obj):
 
        rev = match_obj.groups()[0]
 
        pref = ''
 
        if match_obj.group().startswith(' '):
 
            pref = ' '
 
        tmpl = (
 
        '%(pref)s<a class="%(cls)s" href="%(url)s">'
 
        '%(rev)s'
 
        '</a>'
 
        )
 
        return tmpl % {
 
         'pref': pref,
 
         'cls': 'revision-link',
 
         'url': url('changeset_home', repo_name=repository, revision=rev),
 
         'rev': rev,
 
        }
 

	
 
    newtext = URL_PAT.sub(url_func, text_)
 

	
 
    return newtext
 

	
 

	
 
def urlify_commit(text_, repository=None, link_=None):
 
    """
 
    Parses given text message and makes proper links.
 
    issues are linked to given issue-server, and rest is a changeset link
 
    if link_ is given, in other case it's a plain text
 

	
 
    :param text_:
 
    :param repository:
 
    :param link_: changeset link
 
    """
 
    import traceback
 

	
 
    def escaper(string):
 
        return string.replace('<', '&lt;').replace('>', '&gt;')
 

	
 
    def linkify_others(t, l):
 
        urls = re.compile(r'(\<a.*?\<\/a\>)',)
 
        links = []
 
        for e in urls.split(t):
 
            if not urls.match(e):
 
                links.append('<a class="message-link" href="%s">%s</a>' % (l, e))
 
            else:
 
                links.append(e)
 

	
 
        return ''.join(links)
 

	
 
    # urlify changesets - extrac revisions and make link out of them
 
    newtext = urlify_changesets(escaper(text_), repository)
 

	
 
    try:
 
        conf = config['app_conf']
 

	
 
        # allow multiple issue servers to be used
 
        valid_indices = [
 
            x.group(1)
 
            for x in map(lambda x: re.match(r'issue_pat(.*)', x), conf.keys())
 
            if x and 'issue_server_link%s' % x.group(1) in conf
 
            and 'issue_prefix%s' % x.group(1) in conf
 
        ]
 

	
 
        log.debug('found issue server suffixes `%s` during valuation of: %s'
 
                  % (','.join(valid_indices), newtext))
 

	
 
        for pattern_index in valid_indices:
 
            ISSUE_PATTERN = conf.get('issue_pat%s' % pattern_index)
 
            ISSUE_SERVER_LNK = conf.get('issue_server_link%s' % pattern_index)
 
            ISSUE_PREFIX = conf.get('issue_prefix%s' % pattern_index)
 

	
 
            log.debug('pattern suffix `%s` PAT:%s SERVER_LINK:%s PREFIX:%s'
 
                      % (pattern_index, ISSUE_PATTERN, ISSUE_SERVER_LNK,
 
                         ISSUE_PREFIX))
 

	
 
            URL_PAT = re.compile(r'%s' % ISSUE_PATTERN)
 

	
 
            def url_func(match_obj):
 
                pref = ''
 
                if match_obj.group().startswith(' '):
 
                    pref = ' '
 

	
 
                issue_id = ''.join(match_obj.groups())
 
                tmpl = (
 
                '%(pref)s<a class="%(cls)s" href="%(url)s">'
 
                '%(issue-prefix)s%(id-repr)s'
 
                '</a>'
 
                )
 
                url = ISSUE_SERVER_LNK.replace('{id}', issue_id)
 
                if repository:
 
                    url = url.replace('{repo}', repository)
 
                    repo_name = repository.split(URL_SEP)[-1]
 
                    url = url.replace('{repo_name}', repo_name)
 

	
 
                return tmpl % {
 
                     'pref': pref,
 
                     'cls': 'issue-tracker-link',
 
                     'url': url,
 
                     'id-repr': issue_id,
 
                     'issue-prefix': ISSUE_PREFIX,
 
                     'serv': ISSUE_SERVER_LNK,
 
                }
 
            newtext = URL_PAT.sub(url_func, newtext)
 
            log.debug('processed prefix:`%s` => %s' % (pattern_index, newtext))
 

	
 
        # if we actually did something above
 
        if link_:
 
            # wrap not links into final link => link_
 
            newtext = linkify_others(newtext, link_)
 
    except:
 
        log.error(traceback.format_exc())
 
        pass
 

	
 
    return literal(newtext)
 

	
 

	
 
def rst(source):
 
    return literal('<div class="rst-block">%s</div>' %
 
                   MarkupRenderer.rst(source))
 

	
 

	
 
def rst_w_mentions(source):
 
    """
 
    Wrapped rst renderer with @mention highlighting
 

	
 
    :param source:
 
    """
 
    return literal('<div class="rst-block">%s</div>' %
 
                   MarkupRenderer.rst_with_mentions(source))
 

	
 

	
 
def changeset_status(repo, revision):
 
    return ChangesetStatusModel().get_status(repo, revision)
 

	
 

	
 
def changeset_status_lbl(changeset_status):
 
    return dict(ChangesetStatus.STATUSES).get(changeset_status)
 

	
 

	
 
def get_permission_name(key):
 
    return dict(Permission.PERMS).get(key)
rhodecode/lib/utils.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
"""
 
    rhodecode.lib.utils
 
    ~~~~~~~~~~~~~~~~~~~
 

	
 
    Utilities library for RhodeCode
 

	
 
    :created_on: Apr 18, 2010
 
    :author: marcink
 
    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
 
    :license: GPLv3, see COPYING for more details.
 
"""
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 

	
 
import os
 
import re
 
import logging
 
import datetime
 
import traceback
 
import paste
 
import beaker
 
import tarfile
 
import shutil
 
import decorator
 
import warnings
 
from os.path import abspath
 
from os.path import dirname as dn, join as jn
 

	
 
from paste.script.command import Command, BadCommand
 

	
 
from mercurial import ui, config
 

	
 
from webhelpers.text import collapse, remove_formatting, strip_tags
 

	
 
from rhodecode.lib.vcs import get_backend
 
from rhodecode.lib.vcs.backends.base import BaseChangeset
 
from rhodecode.lib.vcs.utils.lazy import LazyProperty
 
from rhodecode.lib.vcs.utils.helpers import get_scm
 
from rhodecode.lib.vcs.exceptions import VCSError
 

	
 
from rhodecode.lib.caching_query import FromCache
 

	
 
from rhodecode.model import meta
 
from rhodecode.model.db import Repository, User, RhodeCodeUi, \
 
    UserLog, RepoGroup, RhodeCodeSetting, CacheInvalidation
 
from rhodecode.model.meta import Session
 
from rhodecode.model.repos_group import ReposGroupModel
 
from rhodecode.lib.utils2 import safe_str, safe_unicode
 
from rhodecode.lib.vcs.utils.fakemod import create_module
 

	
 
log = logging.getLogger(__name__)
 

	
 
REMOVED_REPO_PAT = re.compile(r'rm__\d{8}_\d{6}_\d{6}__.*')
 

	
 

	
 
def recursive_replace(str_, replace=' '):
 
    """
 
    Recursive replace of given sign to just one instance
 

	
 
    :param str_: given string
 
    :param replace: char to find and replace multiple instances
 

	
 
    Examples::
 
    >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-')
 
    'Mighty-Mighty-Bo-sstones'
 
    """
 

	
 
    if str_.find(replace * 2) == -1:
 
        return str_
 
    else:
 
        str_ = str_.replace(replace * 2, replace)
 
        return recursive_replace(str_, replace)
 

	
 

	
 
def repo_name_slug(value):
 
    """
 
    Return slug of name of repository
 
    This function is called on each creation/modification
 
    of repository to prevent bad names in repo
 
    """
 

	
 
    slug = remove_formatting(value)
 
    slug = strip_tags(slug)
 

	
 
    for c in """`?=[]\;'"<>,/~!@#$%^&*()+{}|: """:
 
        slug = slug.replace(c, '-')
 
    slug = recursive_replace(slug, '-')
 
    slug = collapse(slug, '-')
 
    return slug
 

	
 

	
 
def get_repo_slug(request):
 
    _repo = request.environ['pylons.routes_dict'].get('repo_name')
 
    if _repo:
 
        _repo = _repo.rstrip('/')
 
    return _repo
 

	
 

	
 
def get_repos_group_slug(request):
 
    _group = request.environ['pylons.routes_dict'].get('group_name')
 
    if _group:
 
        _group = _group.rstrip('/')
 
    return _group
 

	
 

	
 
def action_logger(user, action, repo, ipaddr='', sa=None, commit=False):
 
    """
 
    Action logger for various actions made by users
 

	
 
    :param user: user that made this action, can be a unique username string or
 
        object containing user_id attribute
 
    :param action: action to log, should be on of predefined unique actions for
 
        easy translations
 
    :param repo: string name of repository or object containing repo_id,
 
        that action was made on
 
    :param ipaddr: optional ip address from what the action was made
 
    :param sa: optional sqlalchemy session
 

	
 
    """
 

	
 
    if not sa:
 
        sa = meta.Session()
 

	
 
    try:
 
        if hasattr(user, 'user_id'):
 
            user_obj = user
 
            user_obj = User.get(user.user_id)
 
        elif isinstance(user, basestring):
 
            user_obj = User.get_by_username(user)
 
        else:
 
            raise Exception('You have to provide a user object or a username')
 

	
 
        if hasattr(repo, 'repo_id'):
 
            repo_obj = Repository.get(repo.repo_id)
 
            repo_name = repo_obj.repo_name
 
        elif  isinstance(repo, basestring):
 
            repo_name = repo.lstrip('/')
 
            repo_obj = Repository.get_by_repo_name(repo_name)
 
        else:
 
            repo_obj = None
 
            repo_name = ''
 

	
 
        user_log = UserLog()
 
        user_log.user_id = user_obj.user_id
 
        user_log.username = user_obj.username
 
        user_log.action = safe_unicode(action)
 

	
 
        user_log.repository = repo_obj
 
        user_log.repository_name = repo_name
 

	
 
        user_log.action_date = datetime.datetime.now()
 
        user_log.user_ip = ipaddr
 
        sa.add(user_log)
 

	
 
        log.info(
 
            'Adding user %s, action %s on %s' % (user_obj, action,
 
                                                 safe_unicode(repo))
 
        )
 
        if commit:
 
            sa.commit()
 
    except:
 
        log.error(traceback.format_exc())
 
        raise
 

	
 

	
 
def get_repos(path, recursive=False):
 
    """
 
    Scans given path for repos and return (name,(type,path)) tuple
 

	
 
    :param path: path to scan for repositories
 
    :param recursive: recursive search and return names with subdirs in front
 
    """
 

	
 
    # remove ending slash for better results
 
    path = path.rstrip(os.sep)
 

	
 
    def _get_repos(p):
 
        if not os.access(p, os.W_OK):
 
            return
 
        for dirpath in os.listdir(p):
 
            if os.path.isfile(os.path.join(p, dirpath)):
 
                continue
 
            cur_path = os.path.join(p, dirpath)
 
            try:
 
                scm_info = get_scm(cur_path)
 
                yield scm_info[1].split(path, 1)[-1].lstrip(os.sep), scm_info
 
            except VCSError:
 
                if not recursive:
 
                    continue
 
                #check if this dir containts other repos for recursive scan
 
                rec_path = os.path.join(p, dirpath)
 
                if os.path.isdir(rec_path):
 
                    for inner_scm in _get_repos(rec_path):
 
                        yield inner_scm
 

	
 
    return _get_repos(path)
 

	
 

	
 
def is_valid_repo(repo_name, base_path, scm=None):
 
    """
 
    Returns True if given path is a valid repository False otherwise.
 
    If scm param is given also compare if given scm is the same as expected
 
    from scm parameter
 

	
 
    :param repo_name:
 
    :param base_path:
 
    :param scm:
 

	
 
    :return True: if given path is a valid repository
 
    """
 
    full_path = os.path.join(safe_str(base_path), safe_str(repo_name))
 

	
 
    try:
 
        scm_ = get_scm(full_path)
 
        if scm:
 
            return scm_[0] == scm
 
        return True
 
    except VCSError:
 
        return False
 

	
 

	
 
def is_valid_repos_group(repos_group_name, base_path):
 
    """
 
    Returns True if given path is a repos group False otherwise
 

	
 
    :param repo_name:
 
    :param base_path:
 
    """
 
    full_path = os.path.join(safe_str(base_path), safe_str(repos_group_name))
 

	
 
    # check if it's not a repo
 
    if is_valid_repo(repos_group_name, base_path):
 
        return False
 

	
 
    try:
 
        # we need to check bare git repos at higher level
 
        # since we might match branches/hooks/info/objects or possible
 
        # other things inside bare git repo
 
        get_scm(os.path.dirname(full_path))
 
        return False
 
    except VCSError:
 
        pass
 

	
 
    # check if it's a valid path
 
    if os.path.isdir(full_path):
 
        return True
 

	
 
    return False
 

	
 

	
 
def ask_ok(prompt, retries=4, complaint='Yes or no please!'):
 
    while True:
 
        ok = raw_input(prompt)
 
        if ok in ('y', 'ye', 'yes'):
 
            return True
 
        if ok in ('n', 'no', 'nop', 'nope'):
 
            return False
 
        retries = retries - 1
 
        if retries < 0:
 
            raise IOError
 
        print complaint
 

	
 
#propagated from mercurial documentation
 
ui_sections = ['alias', 'auth',
 
                'decode/encode', 'defaults',
 
                'diff', 'email',
 
                'extensions', 'format',
 
                'merge-patterns', 'merge-tools',
 
                'hooks', 'http_proxy',
 
                'smtp', 'patch',
 
                'paths', 'profiling',
 
                'server', 'trusted',
 
                'ui', 'web', ]
 

	
 

	
 
def make_ui(read_from='file', path=None, checkpaths=True, clear_session=True):
 
    """
 
    A function that will read python rc files or database
 
    and make an mercurial ui object from read options
 

	
 
    :param path: path to mercurial config file
 
    :param checkpaths: check the path
 
    :param read_from: read from 'file' or 'db'
 
    """
 

	
 
    baseui = ui.ui()
 

	
 
    # clean the baseui object
 
    baseui._ocfg = config.config()
 
    baseui._ucfg = config.config()
 
    baseui._tcfg = config.config()
 

	
 
    if read_from == 'file':
 
        if not os.path.isfile(path):
 
            log.debug('hgrc file is not present at %s, skipping...' % path)
 
            return False
 
        log.debug('reading hgrc from %s' % path)
 
        cfg = config.config()
 
        cfg.read(path)
 
        for section in ui_sections:
 
            for k, v in cfg.items(section):
 
                log.debug('settings ui from file[%s]%s:%s' % (section, k, v))
 
                baseui.setconfig(safe_str(section), safe_str(k), safe_str(v))
 

	
 
    elif read_from == 'db':
 
        sa = meta.Session()
 
        ret = sa.query(RhodeCodeUi)\
 
            .options(FromCache("sql_cache_short", "get_hg_ui_settings"))\
 
            .all()
 

	
 
        hg_ui = ret
 
        for ui_ in hg_ui:
 
            if ui_.ui_active:
 
                log.debug('settings ui from db[%s]%s:%s', ui_.ui_section,
 
                          ui_.ui_key, ui_.ui_value)
 
                baseui.setconfig(safe_str(ui_.ui_section), safe_str(ui_.ui_key),
 
                                 safe_str(ui_.ui_value))
 
            if ui_.ui_key == 'push_ssl':
 
                # force set push_ssl requirement to False, rhodecode
 
                # handles that
 
                baseui.setconfig(safe_str(ui_.ui_section), safe_str(ui_.ui_key),
 
                                 False)
 
        if clear_session:
 
            meta.Session.remove()
 
    return baseui
 

	
 

	
 
def set_rhodecode_config(config):
 
    """
 
    Updates pylons config with new settings from database
 

	
 
    :param config:
 
    """
 
    hgsettings = RhodeCodeSetting.get_app_settings()
 

	
 
    for k, v in hgsettings.items():
 
        config[k] = v
 

	
 

	
 
def invalidate_cache(cache_key, *args):
 
    """
 
    Puts cache invalidation task into db for
 
    further global cache invalidation
 
    """
 

	
 
    from rhodecode.model.scm import ScmModel
 

	
 
    if cache_key.startswith('get_repo_cached_'):
 
        name = cache_key.split('get_repo_cached_')[-1]
 
        ScmModel().mark_for_invalidation(name)
 

	
 

	
 
def map_groups(path):
 
    """
 
    Given a full path to a repository, create all nested groups that this
 
    repo is inside. This function creates parent-child relationships between
 
    groups and creates default perms for all new groups.
 

	
 
    :param paths: full path to repository
 
    """
 
    sa = meta.Session()
 
    groups = path.split(Repository.url_sep())
 
    parent = None
 
    group = None
 

	
 
    # last element is repo in nested groups structure
 
    groups = groups[:-1]
 
    rgm = ReposGroupModel(sa)
 
    for lvl, group_name in enumerate(groups):
 
        group_name = '/'.join(groups[:lvl] + [group_name])
 
        group = RepoGroup.get_by_group_name(group_name)
 
        desc = '%s group' % group_name
 

	
 
        # skip folders that are now removed repos
 
        if REMOVED_REPO_PAT.match(group_name):
 
            break
 

	
 
        if group is None:
 
            log.debug('creating group level: %s group_name: %s' % (lvl,
 
                                                                   group_name))
 
            group = RepoGroup(group_name, parent)
 
            group.group_description = desc
 
            sa.add(group)
 
            rgm._create_default_perms(group)
 
            sa.flush()
 
        parent = group
 
    return group
 

	
 

	
 
def repo2db_mapper(initial_repo_list, remove_obsolete=False,
 
                   install_git_hook=False):
 
    """
 
    maps all repos given in initial_repo_list, non existing repositories
 
    are created, if remove_obsolete is True it also check for db entries
 
    that are not in initial_repo_list and removes them.
 

	
 
    :param initial_repo_list: list of repositories found by scanning methods
 
    :param remove_obsolete: check for obsolete entries in database
 
    :param install_git_hook: if this is True, also check and install githook
 
        for a repo if missing
 
    """
 
    from rhodecode.model.repo import RepoModel
 
    from rhodecode.model.scm import ScmModel
 
    sa = meta.Session()
 
    rm = RepoModel()
 
    user = sa.query(User).filter(User.admin == True).first()
 
    if user is None:
 
        raise Exception('Missing administrative account!')
 
    added = []
 

	
 
#    # clear cache keys
 
#    log.debug("Clearing cache keys now...")
 
#    CacheInvalidation.clear_cache()
 
#    sa.commit()
 

	
 
    for name, repo in initial_repo_list.items():
 
        group = map_groups(name)
 
        db_repo = rm.get_by_repo_name(name)
 
        # found repo that is on filesystem not in RhodeCode database
 
        if not db_repo:
 
            log.info('repository %s not found, creating now' % name)
 
            added.append(name)
 
            desc = (repo.description
 
                    if repo.description != 'unknown'
 
                    else '%s repository' % name)
 
            new_repo = rm.create_repo(
 
                repo_name=name,
 
                repo_type=repo.alias,
 
                description=desc,
 
                repos_group=getattr(group, 'group_id', None),
 
                owner=user,
 
                just_db=True
 
            )
 
            # we added that repo just now, and make sure it has githook
 
            # installed
 
            if new_repo.repo_type == 'git':
 
                ScmModel().install_git_hook(new_repo.scm_instance)
 
        elif install_git_hook:
 
            if db_repo.repo_type == 'git':
 
                ScmModel().install_git_hook(db_repo.scm_instance)
 
        # during starting install all cache keys for all repositories in the
 
        # system, this will register all repos and multiple instances
 
        key, _prefix, _org_key = CacheInvalidation._get_key(name)
 
        CacheInvalidation.invalidate(name)
 
        log.debug("Creating a cache key for %s instance_id=>`%s`"
 
                  % (name, _prefix or '-'))
 

	
 
    sa.commit()
 
    removed = []
 
    if remove_obsolete:
 
        # remove from database those repositories that are not in the filesystem
 
        for repo in sa.query(Repository).all():
 
            if repo.repo_name not in initial_repo_list.keys():
 
                log.debug("Removing non-existing repository found in db `%s`" %
 
                          repo.repo_name)
 
                try:
 
                    sa.delete(repo)
 
                    sa.commit()
 
                    removed.append(repo.repo_name)
 
                except:
 
                    #don't hold further removals on error
 
                    log.error(traceback.format_exc())
 
                    sa.rollback()
 

	
 
    return added, removed
 

	
 

	
 
# set cache regions for beaker so celery can utilise it
 
def add_cache(settings):
 
    cache_settings = {'regions': None}
 
    for key in settings.keys():
 
        for prefix in ['beaker.cache.', 'cache.']:
 
            if key.startswith(prefix):
 
                name = key.split(prefix)[1].strip()
 
                cache_settings[name] = settings[key].strip()
 
    if cache_settings['regions']:
 
        for region in cache_settings['regions'].split(','):
 
            region = region.strip()
 
            region_settings = {}
 
            for key, value in cache_settings.items():
 
                if key.startswith(region):
 
                    region_settings[key.split('.')[1]] = value
 
            region_settings['expire'] = int(region_settings.get('expire',
 
                                                                60))
 
            region_settings.setdefault('lock_dir',
 
                                       cache_settings.get('lock_dir'))
 
            region_settings.setdefault('data_dir',
 
                                       cache_settings.get('data_dir'))
 

	
 
            if 'type' not in region_settings:
 
                region_settings['type'] = cache_settings.get('type',
 
                                                             'memory')
 
            beaker.cache.cache_regions[region] = region_settings
 

	
 

	
 
def load_rcextensions(root_path):
 
    import rhodecode
 
    from rhodecode.config import conf
 

	
 
    path = os.path.join(root_path, 'rcextensions', '__init__.py')
 
    if os.path.isfile(path):
 
        rcext = create_module('rc', path)
 
        EXT = rhodecode.EXTENSIONS = rcext
 
        log.debug('Found rcextensions now loading %s...' % rcext)
 

	
 
        # Additional mappings that are not present in the pygments lexers
 
        conf.LANGUAGES_EXTENSIONS_MAP.update(getattr(EXT, 'EXTRA_MAPPINGS', {}))
 

	
 
        #OVERRIDE OUR EXTENSIONS FROM RC-EXTENSIONS (if present)
 

	
 
        if getattr(EXT, 'INDEX_EXTENSIONS', []) != []:
 
            log.debug('settings custom INDEX_EXTENSIONS')
 
            conf.INDEX_EXTENSIONS = getattr(EXT, 'INDEX_EXTENSIONS', [])
 

	
 
        #ADDITIONAL MAPPINGS
 
        log.debug('adding extra into INDEX_EXTENSIONS')
 
        conf.INDEX_EXTENSIONS.extend(getattr(EXT, 'EXTRA_INDEX_EXTENSIONS', []))
 

	
 

	
 
#==============================================================================
 
# TEST FUNCTIONS AND CREATORS
 
#==============================================================================
 
def create_test_index(repo_location, config, full_index):
 
    """
 
    Makes default test index
 

	
 
    :param config: test config
 
    :param full_index:
 
    """
 

	
 
    from rhodecode.lib.indexers.daemon import WhooshIndexingDaemon
 
    from rhodecode.lib.pidlock import DaemonLock, LockHeld
 

	
 
    repo_location = repo_location
 

	
 
    index_location = os.path.join(config['app_conf']['index_dir'])
 
    if not os.path.exists(index_location):
 
        os.makedirs(index_location)
 

	
 
    try:
 
        l = DaemonLock(file_=jn(dn(index_location), 'make_index.lock'))
 
        WhooshIndexingDaemon(index_location=index_location,
 
                             repo_location=repo_location)\
 
            .run(full_index=full_index)
 
        l.release()
 
    except LockHeld:
 
        pass
 

	
 

	
 
def create_test_env(repos_test_path, config):
 
    """
 
    Makes a fresh database and
 
    install test repository into tmp dir
 
    """
 
    from rhodecode.lib.db_manage import DbManage
 
    from rhodecode.tests import HG_REPO, GIT_REPO, TESTS_TMP_PATH
 

	
 
    # PART ONE create db
 
    dbconf = config['sqlalchemy.db1.url']
 
    log.debug('making test db %s' % dbconf)
 

	
 
    # create test dir if it doesn't exist
 
    if not os.path.isdir(repos_test_path):
 
        log.debug('Creating testdir %s' % repos_test_path)
 
        os.makedirs(repos_test_path)
 

	
 
    dbmanage = DbManage(log_sql=True, dbconf=dbconf, root=config['here'],
 
                        tests=True)
 
    dbmanage.create_tables(override=True)
 
    dbmanage.create_settings(dbmanage.config_prompt(repos_test_path))
 
    dbmanage.create_default_user()
 
    dbmanage.admin_prompt()
 
    dbmanage.create_permissions()
 
    dbmanage.populate_default_permissions()
 
    Session().commit()
 
    # PART TWO make test repo
 
    log.debug('making test vcs repositories')
 

	
 
    idx_path = config['app_conf']['index_dir']
 
    data_path = config['app_conf']['cache_dir']
 

	
 
    #clean index and data
 
    if idx_path and os.path.exists(idx_path):
 
        log.debug('remove %s' % idx_path)
 
        shutil.rmtree(idx_path)
 

	
 
    if data_path and os.path.exists(data_path):
 
        log.debug('remove %s' % data_path)
 
        shutil.rmtree(data_path)
 

	
 
    #CREATE DEFAULT TEST REPOS
 
    cur_dir = dn(dn(abspath(__file__)))
 
    tar = tarfile.open(jn(cur_dir, 'tests', "vcs_test_hg.tar.gz"))
 
    tar.extractall(jn(TESTS_TMP_PATH, HG_REPO))
 
    tar.close()
 

	
 
    cur_dir = dn(dn(abspath(__file__)))
 
    tar = tarfile.open(jn(cur_dir, 'tests', "vcs_test_git.tar.gz"))
 
    tar.extractall(jn(TESTS_TMP_PATH, GIT_REPO))
 
    tar.close()
 

	
 
    #LOAD VCS test stuff
 
    from rhodecode.tests.vcs import setup_package
 
    setup_package()
 

	
 

	
 
#==============================================================================
 
# PASTER COMMANDS
 
#==============================================================================
 
class BasePasterCommand(Command):
 
    """
 
    Abstract Base Class for paster commands.
 

	
 
    The celery commands are somewhat aggressive about loading
 
    celery.conf, and since our module sets the `CELERY_LOADER`
 
    environment variable to our loader, we have to bootstrap a bit and
 
    make sure we've had a chance to load the pylons config off of the
 
    command line, otherwise everything fails.
 
    """
 
    min_args = 1
 
    min_args_error = "Please provide a paster config file as an argument."
 
    takes_config_file = 1
 
    requires_config_file = True
 

	
 
    def notify_msg(self, msg, log=False):
 
        """Make a notification to user, additionally if logger is passed
 
        it logs this action using given logger
 

	
 
        :param msg: message that will be printed to user
 
        :param log: logging instance, to use to additionally log this message
 

	
 
        """
 
        if log and isinstance(log, logging):
 
            log(msg)
 

	
 
    def run(self, args):
 
        """
 
        Overrides Command.run
 

	
 
        Checks for a config file argument and loads it.
 
        """
 
        if len(args) < self.min_args:
 
            raise BadCommand(
 
                self.min_args_error % {'min_args': self.min_args,
 
                                       'actual_args': len(args)})
 

	
 
        # Decrement because we're going to lob off the first argument.
 
        # @@ This is hacky
 
        self.min_args -= 1
 
        self.bootstrap_config(args[0])
 
        self.update_parser()
 
        return super(BasePasterCommand, self).run(args[1:])
 

	
 
    def update_parser(self):
 
        """
 
        Abstract method.  Allows for the class's parser to be updated
 
        before the superclass's `run` method is called.  Necessary to
 
        allow options/arguments to be passed through to the underlying
 
        celery command.
 
        """
 
        raise NotImplementedError("Abstract Method.")
 

	
 
    def bootstrap_config(self, conf):
 
        """
 
        Loads the pylons configuration.
 
        """
 
        from pylons import config as pylonsconfig
 

	
 
        self.path_to_ini_file = os.path.realpath(conf)
 
        conf = paste.deploy.appconfig('config:' + self.path_to_ini_file)
 
        pylonsconfig.init_app(conf.global_conf, conf.local_conf)
 

	
 

	
 
def check_git_version():
 
    """
 
    Checks what version of git is installed in system, and issues a warning
 
    if it's too old for RhodeCode to properly work.
 
    """
 
    import subprocess
 
    from distutils.version import StrictVersion
 
    from rhodecode import BACKENDS
 

	
 
    p = subprocess.Popen('git --version', shell=True,
 
                        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 
    stdout, stderr = p.communicate()
 
    ver = (stdout.split(' ')[-1] or '').strip() or '0.0.0'
 
    if len(ver.split('.')) > 3:
 
        #StrictVersion needs to be only 3 element type
 
        ver = '.'.join(ver.split('.')[:3])
 
    try:
 
        _ver = StrictVersion(ver)
 
    except:
 
        _ver = StrictVersion('0.0.0')
 
        stderr = traceback.format_exc()
 

	
 
    req_ver = '1.7.4'
 
    to_old_git = False
 
    if  _ver < StrictVersion(req_ver):
 
        to_old_git = True
 

	
 
    if 'git' in BACKENDS:
 
        log.debug('GIT version detected: %s' % stdout)
 
        if stderr:
 
            log.warning('Unable to detect git version org error was:%r' % stderr)
 
        elif to_old_git:
 
            log.warning('RhodeCode detected git version %s, which is too old '
 
                        'for the system to function properly. Make sure '
 
                        'its version is at least %s' % (ver, req_ver))
 
    return _ver
 

	
 

	
 
@decorator.decorator
 
def jsonify(func, *args, **kwargs):
 
    """Action decorator that formats output for JSON
 

	
 
    Given a function that will return content, this decorator will turn
 
    the result into JSON, with a content-type of 'application/json' and
 
    output it.
 

	
 
    """
 
    from pylons.decorators.util import get_pylons
 
    from rhodecode.lib.ext_json import json
 
    pylons = get_pylons(args)
 
    pylons.response.headers['Content-Type'] = 'application/json; charset=utf-8'
 
    data = func(*args, **kwargs)
 
    if isinstance(data, (list, tuple)):
 
        msg = "JSON responses with Array envelopes are susceptible to " \
 
              "cross-site data leak attacks, see " \
 
              "http://wiki.pylonshq.com/display/pylonsfaq/Warnings"
 
        warnings.warn(msg, Warning, 2)
 
        log.warning(msg)
 
    log.debug("Returning JSON wrapped action output")
 
    return json.dumps(data, encoding='utf-8')
 
\ No newline at end of file
rhodecode/model/db.py
Show inline comments
 
# -*- coding: utf-8 -*-
 
"""
 
    rhodecode.model.db
 
    ~~~~~~~~~~~~~~~~~~
 

	
 
    Database Models for RhodeCode
 

	
 
    :created_on: Apr 08, 2010
 
    :author: marcink
 
    :copyright: (C) 2010-2012 Marcin Kuzminski <marcin@python-works.com>
 
    :license: GPLv3, see COPYING for more details.
 
"""
 
# This program is free software: you can redistribute it and/or modify
 
# it under the terms of the GNU General Public License as published by
 
# the Free Software Foundation, either version 3 of the License, or
 
# (at your option) any later version.
 
#
 
# This program is distributed in the hope that it will be useful,
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
# GNU General Public License for more details.
 
#
 
# You should have received a copy of the GNU General Public License
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 

	
 
import os
 
import logging
 
import datetime
 
import traceback
 
import hashlib
 
import time
 
from collections import defaultdict
 

	
 
from sqlalchemy import *
 
from sqlalchemy.ext.hybrid import hybrid_property
 
from sqlalchemy.orm import relationship, joinedload, class_mapper, validates
 
from sqlalchemy.exc import DatabaseError
 
from beaker.cache import cache_region, region_invalidate
 
from webob.exc import HTTPNotFound
 

	
 
from pylons.i18n.translation import lazy_ugettext as _
 

	
 
from rhodecode.lib.vcs import get_backend
 
from rhodecode.lib.vcs.utils.helpers import get_scm
 
from rhodecode.lib.vcs.exceptions import VCSError
 
from rhodecode.lib.vcs.utils.lazy import LazyProperty
 

	
 
from rhodecode.lib.utils2 import str2bool, safe_str, get_changeset_safe, \
 
    safe_unicode, remove_suffix, remove_prefix
 
from rhodecode.lib.compat import json
 
from rhodecode.lib.caching_query import FromCache
 

	
 
from rhodecode.model.meta import Base, Session
 

	
 
URL_SEP = '/'
 
log = logging.getLogger(__name__)
 

	
 
#==============================================================================
 
# BASE CLASSES
 
#==============================================================================
 

	
 
_hash_key = lambda k: hashlib.md5(safe_str(k)).hexdigest()
 

	
 

	
 
class BaseModel(object):
 
    """
 
    Base Model for all classess
 
    """
 

	
 
    @classmethod
 
    def _get_keys(cls):
 
        """return column names for this model """
 
        return class_mapper(cls).c.keys()
 

	
 
    def get_dict(self):
 
        """
 
        return dict with keys and values corresponding
 
        to this model data """
 

	
 
        d = {}
 
        for k in self._get_keys():
 
            d[k] = getattr(self, k)
 

	
 
        # also use __json__() if present to get additional fields
 
        _json_attr = getattr(self, '__json__', None)
 
        if _json_attr:
 
            # update with attributes from __json__
 
            if callable(_json_attr):
 
                _json_attr = _json_attr()
 
            for k, val in _json_attr.iteritems():
 
                d[k] = val
 
        return d
 

	
 
    def get_appstruct(self):
 
        """return list with keys and values tupples corresponding
 
        to this model data """
 

	
 
        l = []
 
        for k in self._get_keys():
 
            l.append((k, getattr(self, k),))
 
        return l
 

	
 
    def populate_obj(self, populate_dict):
 
        """populate model with data from given populate_dict"""
 

	
 
        for k in self._get_keys():
 
            if k in populate_dict:
 
                setattr(self, k, populate_dict[k])
 

	
 
    @classmethod
 
    def query(cls):
 
        return Session().query(cls)
 

	
 
    @classmethod
 
    def get(cls, id_):
 
        if id_:
 
            return cls.query().get(id_)
 

	
 
    @classmethod
 
    def get_or_404(cls, id_):
 
        try:
 
            id_ = int(id_)
 
        except (TypeError, ValueError):
 
            raise HTTPNotFound
 

	
 
        res = cls.query().get(id_)
 
        if not res:
 
            raise HTTPNotFound
 
        return res
 

	
 
    @classmethod
 
    def getAll(cls):
 
        return cls.query().all()
 

	
 
    @classmethod
 
    def delete(cls, id_):
 
        obj = cls.query().get(id_)
 
        Session().delete(obj)
 

	
 
    def __repr__(self):
 
        if hasattr(self, '__unicode__'):
 
            # python repr needs to return str
 
            return safe_str(self.__unicode__())
 
        return '<DB:%s>' % (self.__class__.__name__)
 

	
 

	
 
class RhodeCodeSetting(Base, BaseModel):
 
    __tablename__ = 'rhodecode_settings'
 
    __table_args__ = (
 
        UniqueConstraint('app_settings_name'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'}
 
    )
 
    app_settings_id = Column("app_settings_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    app_settings_name = Column("app_settings_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    _app_settings_value = Column("app_settings_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 

	
 
    def __init__(self, k='', v=''):
 
        self.app_settings_name = k
 
        self.app_settings_value = v
 

	
 
    @validates('_app_settings_value')
 
    def validate_settings_value(self, key, val):
 
        assert type(val) == unicode
 
        return val
 

	
 
    @hybrid_property
 
    def app_settings_value(self):
 
        v = self._app_settings_value
 
        if self.app_settings_name in ["ldap_active",
 
                                      "default_repo_enable_statistics",
 
                                      "default_repo_enable_locking",
 
                                      "default_repo_private",
 
                                      "default_repo_enable_downloads"]:
 
            v = str2bool(v)
 
        return v
 

	
 
    @app_settings_value.setter
 
    def app_settings_value(self, val):
 
        """
 
        Setter that will always make sure we use unicode in app_settings_value
 

	
 
        :param val:
 
        """
 
        self._app_settings_value = safe_unicode(val)
 

	
 
    def __unicode__(self):
 
        return u"<%s('%s:%s')>" % (
 
            self.__class__.__name__,
 
            self.app_settings_name, self.app_settings_value
 
        )
 

	
 
    @classmethod
 
    def get_by_name(cls, key):
 
        return cls.query()\
 
            .filter(cls.app_settings_name == key).scalar()
 

	
 
    @classmethod
 
    def get_by_name_or_create(cls, key):
 
        res = cls.get_by_name(key)
 
        if not res:
 
            res = cls(key)
 
        return res
 

	
 
    @classmethod
 
    def get_app_settings(cls, cache=False):
 

	
 
        ret = cls.query()
 

	
 
        if cache:
 
            ret = ret.options(FromCache("sql_cache_short", "get_hg_settings"))
 

	
 
        if not ret:
 
            raise Exception('Could not get application settings !')
 
        settings = {}
 
        for each in ret:
 
            settings['rhodecode_' + each.app_settings_name] = \
 
                each.app_settings_value
 

	
 
        return settings
 

	
 
    @classmethod
 
    def get_ldap_settings(cls, cache=False):
 
        ret = cls.query()\
 
                .filter(cls.app_settings_name.startswith('ldap_')).all()
 
        fd = {}
 
        for row in ret:
 
            fd.update({row.app_settings_name: row.app_settings_value})
 

	
 
        return fd
 

	
 
    @classmethod
 
    def get_default_repo_settings(cls, cache=False, strip_prefix=False):
 
        ret = cls.query()\
 
                .filter(cls.app_settings_name.startswith('default_')).all()
 
        fd = {}
 
        for row in ret:
 
            key = row.app_settings_name
 
            if strip_prefix:
 
                key = remove_prefix(key, prefix='default_')
 
            fd.update({key: row.app_settings_value})
 

	
 
        return fd
 

	
 

	
 
class RhodeCodeUi(Base, BaseModel):
 
    __tablename__ = 'rhodecode_ui'
 
    __table_args__ = (
 
        UniqueConstraint('ui_key'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'}
 
    )
 

	
 
    HOOK_UPDATE = 'changegroup.update'
 
    HOOK_REPO_SIZE = 'changegroup.repo_size'
 
    HOOK_PUSH = 'changegroup.push_logger'
 
    HOOK_PRE_PUSH = 'prechangegroup.pre_push'
 
    HOOK_PULL = 'outgoing.pull_logger'
 
    HOOK_PRE_PULL = 'preoutgoing.pre_pull'
 

	
 
    ui_id = Column("ui_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    ui_section = Column("ui_section", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    ui_key = Column("ui_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    ui_value = Column("ui_value", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    ui_active = Column("ui_active", Boolean(), nullable=True, unique=None, default=True)
 

	
 
    @classmethod
 
    def get_by_key(cls, key):
 
        return cls.query().filter(cls.ui_key == key).scalar()
 

	
 
    @classmethod
 
    def get_builtin_hooks(cls):
 
        q = cls.query()
 
        q = q.filter(cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
 
                                     cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
 
                                     cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
 
        return q.all()
 

	
 
    @classmethod
 
    def get_custom_hooks(cls):
 
        q = cls.query()
 
        q = q.filter(~cls.ui_key.in_([cls.HOOK_UPDATE, cls.HOOK_REPO_SIZE,
 
                                      cls.HOOK_PUSH, cls.HOOK_PRE_PUSH,
 
                                      cls.HOOK_PULL, cls.HOOK_PRE_PULL]))
 
        q = q.filter(cls.ui_section == 'hooks')
 
        return q.all()
 

	
 
    @classmethod
 
    def get_repos_location(cls):
 
        return cls.get_by_key('/').ui_value
 

	
 
    @classmethod
 
    def create_or_update_hook(cls, key, val):
 
        new_ui = cls.get_by_key(key) or cls()
 
        new_ui.ui_section = 'hooks'
 
        new_ui.ui_active = True
 
        new_ui.ui_key = key
 
        new_ui.ui_value = val
 

	
 
        Session().add(new_ui)
 

	
 
    def __repr__(self):
 
        return '<DB:%s[%s:%s]>' % (self.__class__.__name__, self.ui_key,
 
                                   self.ui_value)
 

	
 

	
 
class User(Base, BaseModel):
 
    __tablename__ = 'users'
 
    __table_args__ = (
 
        UniqueConstraint('username'), UniqueConstraint('email'),
 
        Index('u_username_idx', 'username'),
 
        Index('u_email_idx', 'email'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'}
 
    )
 
    DEFAULT_USER = 'default'
 
    DEFAULT_PERMISSIONS = [
 
        'hg.register.manual_activate', 'hg.create.repository',
 
        'hg.fork.repository', 'repository.read', 'group.read'
 
    ]
 
    user_id = Column("user_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    password = Column("password", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    active = Column("active", Boolean(), nullable=True, unique=None, default=True)
 
    admin = Column("admin", Boolean(), nullable=True, unique=None, default=False)
 
    name = Column("firstname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    lastname = Column("lastname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    last_login = Column("last_login", DateTime(timezone=False), nullable=True, unique=None, default=None)
 
    ldap_dn = Column("ldap_dn", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    api_key = Column("api_key", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    inherit_default_permissions = Column("inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
 

	
 
    user_log = relationship('UserLog', cascade='all')
 
    user_perms = relationship('UserToPerm', primaryjoin="User.user_id==UserToPerm.user_id", cascade='all')
 

	
 
    repositories = relationship('Repository')
 
    user_followers = relationship('UserFollowing', primaryjoin='UserFollowing.follows_user_id==User.user_id', cascade='all')
 
    repo_to_perm = relationship('UserRepoToPerm', primaryjoin='UserRepoToPerm.user_id==User.user_id', cascade='all')
 
    repo_group_to_perm = relationship('UserRepoGroupToPerm', primaryjoin='UserRepoGroupToPerm.user_id==User.user_id', cascade='all')
 

	
 
    group_member = relationship('UsersGroupMember', cascade='all')
 

	
 
    notifications = relationship('UserNotification', cascade='all')
 
    # notifications assigned to this user
 
    user_created_notifications = relationship('Notification', cascade='all')
 
    # comments created by this user
 
    user_comments = relationship('ChangesetComment', cascade='all')
 
    #extra emails for this user
 
    user_emails = relationship('UserEmailMap', cascade='all')
 

	
 
    @hybrid_property
 
    def email(self):
 
        return self._email
 

	
 
    @email.setter
 
    def email(self, val):
 
        self._email = val.lower() if val else None
 

	
 
    @property
 
    def firstname(self):
 
        # alias for future
 
        return self.name
 

	
 
    @property
 
    def emails(self):
 
        other = UserEmailMap.query().filter(UserEmailMap.user==self).all()
 
        return [self.email] + [x.email for x in other]
 

	
 
    @property
 
    def username_and_name(self):
 
        return '%s (%s %s)' % (self.username, self.firstname, self.lastname)
 

	
 
    @property
 
    def full_name(self):
 
        return '%s %s' % (self.firstname, self.lastname)
 

	
 
    @property
 
    def full_name_or_username(self):
 
        return ('%s %s' % (self.firstname, self.lastname)
 
                if (self.firstname and self.lastname) else self.username)
 

	
 
    @property
 
    def full_contact(self):
 
        return '%s %s <%s>' % (self.firstname, self.lastname, self.email)
 

	
 
    @property
 
    def short_contact(self):
 
        return '%s %s' % (self.firstname, self.lastname)
 

	
 
    @property
 
    def is_admin(self):
 
        return self.admin
 

	
 
    def __unicode__(self):
 
        return u"<%s('id:%s:%s')>" % (self.__class__.__name__,
 
                                     self.user_id, self.username)
 

	
 
    @classmethod
 
    def get_by_username(cls, username, case_insensitive=False, cache=False):
 
        if case_insensitive:
 
            q = cls.query().filter(cls.username.ilike(username))
 
        else:
 
            q = cls.query().filter(cls.username == username)
 

	
 
        if cache:
 
            q = q.options(FromCache(
 
                            "sql_cache_short",
 
                            "get_user_%s" % _hash_key(username)
 
                          )
 
            )
 
        return q.scalar()
 

	
 
    @classmethod
 
    def get_by_api_key(cls, api_key, cache=False):
 
        q = cls.query().filter(cls.api_key == api_key)
 

	
 
        if cache:
 
            q = q.options(FromCache("sql_cache_short",
 
                                    "get_api_key_%s" % api_key))
 
        return q.scalar()
 

	
 
    @classmethod
 
    def get_by_email(cls, email, case_insensitive=False, cache=False):
 
        if case_insensitive:
 
            q = cls.query().filter(cls.email.ilike(email))
 
        else:
 
            q = cls.query().filter(cls.email == email)
 

	
 
        if cache:
 
            q = q.options(FromCache("sql_cache_short",
 
                                    "get_email_key_%s" % email))
 

	
 
        ret = q.scalar()
 
        if ret is None:
 
            q = UserEmailMap.query()
 
            # try fetching in alternate email map
 
            if case_insensitive:
 
                q = q.filter(UserEmailMap.email.ilike(email))
 
            else:
 
                q = q.filter(UserEmailMap.email == email)
 
            q = q.options(joinedload(UserEmailMap.user))
 
            if cache:
 
                q = q.options(FromCache("sql_cache_short",
 
                                        "get_email_map_key_%s" % email))
 
            ret = getattr(q.scalar(), 'user', None)
 

	
 
        return ret
 

	
 
    def update_lastlogin(self):
 
        """Update user lastlogin"""
 
        self.last_login = datetime.datetime.now()
 
        Session().add(self)
 
        log.debug('updated user %s lastlogin' % self.username)
 

	
 
    def get_api_data(self):
 
        """
 
        Common function for generating user related data for API
 
        """
 
        user = self
 
        data = dict(
 
            user_id=user.user_id,
 
            username=user.username,
 
            firstname=user.name,
 
            lastname=user.lastname,
 
            email=user.email,
 
            emails=user.emails,
 
            api_key=user.api_key,
 
            active=user.active,
 
            admin=user.admin,
 
            ldap_dn=user.ldap_dn,
 
            last_login=user.last_login,
 
        )
 
        return data
 

	
 
    def __json__(self):
 
        data = dict(
 
            full_name=self.full_name,
 
            full_name_or_username=self.full_name_or_username,
 
            short_contact=self.short_contact,
 
            full_contact=self.full_contact
 
        )
 
        data.update(self.get_api_data())
 
        return data
 

	
 

	
 
class UserEmailMap(Base, BaseModel):
 
    __tablename__ = 'user_email_map'
 
    __table_args__ = (
 
        Index('uem_email_idx', 'email'),
 
        UniqueConstraint('email'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'}
 
    )
 
    __mapper_args__ = {}
 

	
 
    email_id = Column("email_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=True, unique=None, default=None)
 
    _email = Column("email", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
 
    user = relationship('User', lazy='joined')
 

	
 
    @validates('_email')
 
    def validate_email(self, key, email):
 
        # check if this email is not main one
 
        main_email = Session().query(User).filter(User.email == email).scalar()
 
        if main_email is not None:
 
            raise AttributeError('email %s is present is user table' % email)
 
        return email
 

	
 
    @hybrid_property
 
    def email(self):
 
        return self._email
 

	
 
    @email.setter
 
    def email(self, val):
 
        self._email = val.lower() if val else None
 

	
 

	
 
class UserLog(Base, BaseModel):
 
    __tablename__ = 'user_logs'
 
    __table_args__ = (
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'},
 
    )
 
    user_log_id = Column("user_log_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
 
    username = Column("username", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True)
 
    repository_name = Column("repository_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    user_ip = Column("user_ip", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    action = Column("action", UnicodeText(1200000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    action_date = Column("action_date", DateTime(timezone=False), nullable=True, unique=None, default=None)
 

	
 
    @property
 
    def action_as_day(self):
 
        return datetime.date(*self.action_date.timetuple()[:3])
 

	
 
    user = relationship('User')
 
    repository = relationship('Repository', cascade='')
 

	
 

	
 
class UsersGroup(Base, BaseModel):
 
    __tablename__ = 'users_groups'
 
    __table_args__ = (
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'},
 
    )
 

	
 
    users_group_id = Column("users_group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    users_group_name = Column("users_group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
 
    users_group_active = Column("users_group_active", Boolean(), nullable=True, unique=None, default=None)
 
    inherit_default_permissions = Column("users_group_inherit_default_permissions", Boolean(), nullable=False, unique=None, default=True)
 

	
 
    members = relationship('UsersGroupMember', cascade="all, delete, delete-orphan", lazy="joined")
 
    users_group_to_perm = relationship('UsersGroupToPerm', cascade='all')
 
    users_group_repo_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
 

	
 
    def __unicode__(self):
 
        return u'<userGroup(%s)>' % (self.users_group_name)
 

	
 
    @classmethod
 
    def get_by_group_name(cls, group_name, cache=False,
 
                          case_insensitive=False):
 
        if case_insensitive:
 
            q = cls.query().filter(cls.users_group_name.ilike(group_name))
 
        else:
 
            q = cls.query().filter(cls.users_group_name == group_name)
 
        if cache:
 
            q = q.options(FromCache(
 
                            "sql_cache_short",
 
                            "get_user_%s" % _hash_key(group_name)
 
                          )
 
            )
 
        return q.scalar()
 

	
 
    @classmethod
 
    def get(cls, users_group_id, cache=False):
 
        users_group = cls.query()
 
        if cache:
 
            users_group = users_group.options(FromCache("sql_cache_short",
 
                                    "get_users_group_%s" % users_group_id))
 
        return users_group.get(users_group_id)
 

	
 
    def get_api_data(self):
 
        users_group = self
 

	
 
        data = dict(
 
            users_group_id=users_group.users_group_id,
 
            group_name=users_group.users_group_name,
 
            active=users_group.users_group_active,
 
        )
 

	
 
        return data
 

	
 

	
 
class UsersGroupMember(Base, BaseModel):
 
    __tablename__ = 'users_groups_members'
 
    __table_args__ = (
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'},
 
    )
 

	
 
    users_group_member_id = Column("users_group_member_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    users_group_id = Column("users_group_id", Integer(), ForeignKey('users_groups.users_group_id'), nullable=False, unique=None, default=None)
 
    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
 

	
 
    user = relationship('User', lazy='joined')
 
    users_group = relationship('UsersGroup')
 

	
 
    def __init__(self, gr_id='', u_id=''):
 
        self.users_group_id = gr_id
 
        self.user_id = u_id
 

	
 

	
 
class Repository(Base, BaseModel):
 
    __tablename__ = 'repositories'
 
    __table_args__ = (
 
        UniqueConstraint('repo_name'),
 
        Index('r_repo_name_idx', 'repo_name'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'},
 
    )
 

	
 
    repo_id = Column("repo_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    repo_name = Column("repo_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
 
    clone_uri = Column("clone_uri", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
 
    repo_type = Column("repo_type", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
 
    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=False, default=None)
 
    private = Column("private", Boolean(), nullable=True, unique=None, default=None)
 
    enable_statistics = Column("statistics", Boolean(), nullable=True, unique=None, default=True)
 
    enable_downloads = Column("downloads", Boolean(), nullable=True, unique=None, default=True)
 
    description = Column("description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    created_on = Column('created_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
 
    updated_on = Column('updated_on', DateTime(timezone=False), nullable=True, unique=None, default=datetime.datetime.now)
 
    landing_rev = Column("landing_revision", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=False, default=None)
 
    enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
 
    _locked = Column("locked", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=False, default=None)
 

	
 
    fork_id = Column("fork_id", Integer(), ForeignKey('repositories.repo_id'), nullable=True, unique=False, default=None)
 
    group_id = Column("group_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=False, default=None)
 

	
 
    user = relationship('User')
 
    fork = relationship('Repository', remote_side=repo_id)
 
    group = relationship('RepoGroup')
 
    repo_to_perm = relationship('UserRepoToPerm', cascade='all', order_by='UserRepoToPerm.repo_to_perm_id')
 
    users_group_to_perm = relationship('UsersGroupRepoToPerm', cascade='all')
 
    stats = relationship('Statistics', cascade='all', uselist=False)
 

	
 
    followers = relationship('UserFollowing',
 
                             primaryjoin='UserFollowing.follows_repo_id==Repository.repo_id',
 
                             cascade='all')
 

	
 
    logs = relationship('UserLog')
 
    comments = relationship('ChangesetComment', cascade="all, delete, delete-orphan")
 

	
 
    pull_requests_org = relationship('PullRequest',
 
                    primaryjoin='PullRequest.org_repo_id==Repository.repo_id',
 
                    cascade="all, delete, delete-orphan")
 

	
 
    pull_requests_other = relationship('PullRequest',
 
                    primaryjoin='PullRequest.other_repo_id==Repository.repo_id',
 
                    cascade="all, delete, delete-orphan")
 

	
 
    def __unicode__(self):
 
        return u"<%s('%s:%s')>" % (self.__class__.__name__, self.repo_id,
 
                                   self.repo_name)
 

	
 
    @hybrid_property
 
    def locked(self):
 
        # always should return [user_id, timelocked]
 
        if self._locked:
 
            _lock_info = self._locked.split(':')
 
            return int(_lock_info[0]), _lock_info[1]
 
        return [None, None]
 

	
 
    @locked.setter
 
    def locked(self, val):
 
        if val and isinstance(val, (list, tuple)):
 
            self._locked = ':'.join(map(str, val))
 
        else:
 
            self._locked = None
 

	
 
    @classmethod
 
    def url_sep(cls):
 
        return URL_SEP
 

	
 
    @classmethod
 
    def get_by_repo_name(cls, repo_name):
 
        q = Session().query(cls).filter(cls.repo_name == repo_name)
 
        q = q.options(joinedload(Repository.fork))\
 
                .options(joinedload(Repository.user))\
 
                .options(joinedload(Repository.group))
 
        return q.scalar()
 

	
 
    @classmethod
 
    def get_by_full_path(cls, repo_full_path):
 
        repo_name = repo_full_path.split(cls.base_path(), 1)[-1]
 
        return cls.get_by_repo_name(repo_name.strip(URL_SEP))
 

	
 
    @classmethod
 
    def get_repo_forks(cls, repo_id):
 
        return cls.query().filter(Repository.fork_id == repo_id)
 

	
 
    @classmethod
 
    def base_path(cls):
 
        """
 
        Returns base path when all repos are stored
 

	
 
        :param cls:
 
        """
 
        q = Session().query(RhodeCodeUi)\
 
            .filter(RhodeCodeUi.ui_key == cls.url_sep())
 
        q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
 
        return q.one().ui_value
 

	
 
    @property
 
    def forks(self):
 
        """
 
        Return forks of this repo
 
        """
 
        return Repository.get_repo_forks(self.repo_id)
 

	
 
    @property
 
    def parent(self):
 
        """
 
        Returns fork parent
 
        """
 
        return self.fork
 

	
 
    @property
 
    def just_name(self):
 
        return self.repo_name.split(Repository.url_sep())[-1]
 

	
 
    @property
 
    def groups_with_parents(self):
 
        groups = []
 
        if self.group is None:
 
            return groups
 

	
 
        cur_gr = self.group
 
        groups.insert(0, cur_gr)
 
        while 1:
 
            gr = getattr(cur_gr, 'parent_group', None)
 
            cur_gr = cur_gr.parent_group
 
            if gr is None:
 
                break
 
            groups.insert(0, gr)
 

	
 
        return groups
 

	
 
    @property
 
    def groups_and_repo(self):
 
        return self.groups_with_parents, self.just_name
 

	
 
    @LazyProperty
 
    def repo_path(self):
 
        """
 
        Returns base full path for that repository means where it actually
 
        exists on a filesystem
 
        """
 
        q = Session().query(RhodeCodeUi).filter(RhodeCodeUi.ui_key ==
 
                                              Repository.url_sep())
 
        q = q.options(FromCache("sql_cache_short", "repository_repo_path"))
 
        return q.one().ui_value
 

	
 
    @property
 
    def repo_full_path(self):
 
        p = [self.repo_path]
 
        # we need to split the name by / since this is how we store the
 
        # names in the database, but that eventually needs to be converted
 
        # into a valid system path
 
        p += self.repo_name.split(Repository.url_sep())
 
        return os.path.join(*p)
 

	
 
    @property
 
    def cache_keys(self):
 
        """
 
        Returns associated cache keys for that repo
 
        """
 
        return CacheInvalidation.query()\
 
            .filter(CacheInvalidation.cache_args == self.repo_name)\
 
            .order_by(CacheInvalidation.cache_key)\
 
            .all()
 

	
 
    def get_new_name(self, repo_name):
 
        """
 
        returns new full repository name based on assigned group and new new
 

	
 
        :param group_name:
 
        """
 
        path_prefix = self.group.full_path_splitted if self.group else []
 
        return Repository.url_sep().join(path_prefix + [repo_name])
 

	
 
    @property
 
    def _ui(self):
 
        """
 
        Creates an db based ui object for this repository
 
        """
 
        from rhodecode.lib.utils import make_ui
 
        return make_ui('db', clear_session=False)
 

	
 
    @classmethod
 
    def inject_ui(cls, repo, extras={}):
 
        from rhodecode.lib.vcs.backends.hg import MercurialRepository
 
        from rhodecode.lib.vcs.backends.git import GitRepository
 
        required = (MercurialRepository, GitRepository)
 
        if not isinstance(repo, required):
 
            raise Exception('repo must be instance of %s' % required)
 

	
 
        # inject ui extra param to log this action via push logger
 
        for k, v in extras.items():
 
            repo._repo.ui.setconfig('rhodecode_extras', k, v)
 

	
 
    @classmethod
 
    def is_valid(cls, repo_name):
 
        """
 
        returns True if given repo name is a valid filesystem repository
 

	
 
        :param cls:
 
        :param repo_name:
 
        """
 
        from rhodecode.lib.utils import is_valid_repo
 

	
 
        return is_valid_repo(repo_name, cls.base_path())
 

	
 
    def get_api_data(self):
 
        """
 
        Common function for generating repo api data
 

	
 
        """
 
        repo = self
 
        data = dict(
 
            repo_id=repo.repo_id,
 
            repo_name=repo.repo_name,
 
            repo_type=repo.repo_type,
 
            clone_uri=repo.clone_uri,
 
            private=repo.private,
 
            created_on=repo.created_on,
 
            description=repo.description,
 
            landing_rev=repo.landing_rev,
 
            owner=repo.user.username,
 
            fork_of=repo.fork.repo_name if repo.fork else None
 
        )
 

	
 
        return data
 

	
 
    @classmethod
 
    def lock(cls, repo, user_id):
 
        repo.locked = [user_id, time.time()]
 
        Session().add(repo)
 
        Session().commit()
 

	
 
    @classmethod
 
    def unlock(cls, repo):
 
        repo.locked = None
 
        Session().add(repo)
 
        Session().commit()
 

	
 
    @property
 
    def last_db_change(self):
 
        return self.updated_on
 

	
 
    #==========================================================================
 
    # SCM PROPERTIES
 
    #==========================================================================
 

	
 
    def get_changeset(self, rev=None):
 
        return get_changeset_safe(self.scm_instance, rev)
 

	
 
    def get_landing_changeset(self):
 
        """
 
        Returns landing changeset, or if that doesn't exist returns the tip
 
        """
 
        cs = self.get_changeset(self.landing_rev) or self.get_changeset()
 
        return cs
 

	
 
    def update_last_change(self, last_change=None):
 
        if last_change is None:
 
            last_change = datetime.datetime.now()
 
        if self.updated_on is None or self.updated_on != last_change:
 
            log.debug('updated repo %s with new date %s' % (self, last_change))
 
            self.updated_on = last_change
 
            Session().add(self)
 
            Session().commit()
 

	
 
    @property
 
    def tip(self):
 
        return self.get_changeset('tip')
 

	
 
    @property
 
    def author(self):
 
        return self.tip.author
 

	
 
    @property
 
    def last_change(self):
 
        return self.scm_instance.last_change
 

	
 
    def get_comments(self, revisions=None):
 
        """
 
        Returns comments for this repository grouped by revisions
 

	
 
        :param revisions: filter query by revisions only
 
        """
 
        cmts = ChangesetComment.query()\
 
            .filter(ChangesetComment.repo == self)
 
        if revisions:
 
            cmts = cmts.filter(ChangesetComment.revision.in_(revisions))
 
        grouped = defaultdict(list)
 
        for cmt in cmts.all():
 
            grouped[cmt.revision].append(cmt)
 
        return grouped
 

	
 
    def statuses(self, revisions=None):
 
        """
 
        Returns statuses for this repository
 

	
 
        :param revisions: list of revisions to get statuses for
 
        :type revisions: list
 
        """
 

	
 
        statuses = ChangesetStatus.query()\
 
            .filter(ChangesetStatus.repo == self)\
 
            .filter(ChangesetStatus.version == 0)
 
        if revisions:
 
            statuses = statuses.filter(ChangesetStatus.revision.in_(revisions))
 
        grouped = {}
 

	
 
        #maybe we have open new pullrequest without a status ?
 
        stat = ChangesetStatus.STATUS_UNDER_REVIEW
 
        status_lbl = ChangesetStatus.get_status_lbl(stat)
 
        for pr in PullRequest.query().filter(PullRequest.org_repo == self).all():
 
            for rev in pr.revisions:
 
                pr_id = pr.pull_request_id
 
                pr_repo = pr.other_repo.repo_name
 
                grouped[rev] = [stat, status_lbl, pr_id, pr_repo]
 

	
 
        for stat in statuses.all():
 
            pr_id = pr_repo = None
 
            if stat.pull_request:
 
                pr_id = stat.pull_request.pull_request_id
 
                pr_repo = stat.pull_request.other_repo.repo_name
 
            grouped[stat.revision] = [str(stat.status), stat.status_lbl,
 
                                      pr_id, pr_repo]
 
        return grouped
 

	
 
    #==========================================================================
 
    # SCM CACHE INSTANCE
 
    #==========================================================================
 

	
 
    @property
 
    def invalidate(self):
 
        return CacheInvalidation.invalidate(self.repo_name)
 

	
 
    def set_invalidate(self):
 
        """
 
        set a cache for invalidation for this instance
 
        """
 
        CacheInvalidation.set_invalidate(repo_name=self.repo_name)
 

	
 
    @LazyProperty
 
    def scm_instance(self):
 
        import rhodecode
 
        full_cache = str2bool(rhodecode.CONFIG.get('vcs_full_cache'))
 
        if full_cache:
 
            return self.scm_instance_cached()
 
        return self.__get_instance()
 

	
 
    def scm_instance_cached(self, cache_map=None):
 
        @cache_region('long_term')
 
        def _c(repo_name):
 
            return self.__get_instance()
 
        rn = self.repo_name
 
        log.debug('Getting cached instance of repo')
 

	
 
        if cache_map:
 
            # get using prefilled cache_map
 
            invalidate_repo = cache_map[self.repo_name]
 
            if invalidate_repo:
 
                invalidate_repo = (None if invalidate_repo.cache_active
 
                                   else invalidate_repo)
 
        else:
 
            # get from invalidate
 
            invalidate_repo = self.invalidate
 

	
 
        if invalidate_repo is not None:
 
            region_invalidate(_c, None, rn)
 
            # update our cache
 
            CacheInvalidation.set_valid(invalidate_repo.cache_key)
 
        return _c(rn)
 

	
 
    def __get_instance(self):
 
        repo_full_path = self.repo_full_path
 
        try:
 
            alias = get_scm(repo_full_path)[0]
 
            log.debug('Creating instance of %s repository' % alias)
 
            backend = get_backend(alias)
 
        except VCSError:
 
            log.error(traceback.format_exc())
 
            log.error('Perhaps this repository is in db and not in '
 
                      'filesystem run rescan repositories with '
 
                      '"destroy old data " option from admin panel')
 
            return
 

	
 
        if alias == 'hg':
 

	
 
            repo = backend(safe_str(repo_full_path), create=False,
 
                           baseui=self._ui)
 
            # skip hidden web repository
 
            if repo._get_hidden():
 
                return
 
        else:
 
            repo = backend(repo_full_path, create=False)
 

	
 
        return repo
 

	
 

	
 
class RepoGroup(Base, BaseModel):
 
    __tablename__ = 'groups'
 
    __table_args__ = (
 
        UniqueConstraint('group_name', 'group_parent_id'),
 
        CheckConstraint('group_id != group_parent_id'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'},
 
    )
 
    __mapper_args__ = {'order_by': 'group_name'}
 

	
 
    group_id = Column("group_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    group_name = Column("group_name", String(255, convert_unicode=False, assert_unicode=None), nullable=False, unique=True, default=None)
 
    group_parent_id = Column("group_parent_id", Integer(), ForeignKey('groups.group_id'), nullable=True, unique=None, default=None)
 
    group_description = Column("group_description", String(10000, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    enable_locking = Column("enable_locking", Boolean(), nullable=False, unique=None, default=False)
 

	
 
    repo_group_to_perm = relationship('UserRepoGroupToPerm', cascade='all', order_by='UserRepoGroupToPerm.group_to_perm_id')
 
    users_group_to_perm = relationship('UsersGroupRepoGroupToPerm', cascade='all')
 

	
 
    parent_group = relationship('RepoGroup', remote_side=group_id)
 

	
 
    def __init__(self, group_name='', parent_group=None):
 
        self.group_name = group_name
 
        self.parent_group = parent_group
 

	
 
    def __unicode__(self):
 
        return u"<%s('%s:%s')>" % (self.__class__.__name__, self.group_id,
 
                                  self.group_name)
 

	
 
    @classmethod
 
    def groups_choices(cls, check_perms=False):
 
        from webhelpers.html import literal as _literal
 
        from rhodecode.model.scm import ScmModel
 
        groups = cls.query().all()
 
        if check_perms:
 
            #filter group user have access to, it's done
 
            #magically inside ScmModel based on current user
 
            groups = ScmModel().get_repos_groups(groups)
 
        repo_groups = [('', '')]
 
        sep = ' &raquo; '
 
        _name = lambda k: _literal(sep.join(k))
 

	
 
        repo_groups.extend([(x.group_id, _name(x.full_path_splitted))
 
                              for x in groups])
 

	
 
        repo_groups = sorted(repo_groups, key=lambda t: t[1].split(sep)[0])
 
        return repo_groups
 

	
 
    @classmethod
 
    def url_sep(cls):
 
        return URL_SEP
 

	
 
    @classmethod
 
    def get_by_group_name(cls, group_name, cache=False, case_insensitive=False):
 
        if case_insensitive:
 
            gr = cls.query()\
 
                .filter(cls.group_name.ilike(group_name))
 
        else:
 
            gr = cls.query()\
 
                .filter(cls.group_name == group_name)
 
        if cache:
 
            gr = gr.options(FromCache(
 
                            "sql_cache_short",
 
                            "get_group_%s" % _hash_key(group_name)
 
                            )
 
            )
 
        return gr.scalar()
 

	
 
    @property
 
    def parents(self):
 
        parents_recursion_limit = 5
 
        groups = []
 
        if self.parent_group is None:
 
            return groups
 
        cur_gr = self.parent_group
 
        groups.insert(0, cur_gr)
 
        cnt = 0
 
        while 1:
 
            cnt += 1
 
            gr = getattr(cur_gr, 'parent_group', None)
 
            cur_gr = cur_gr.parent_group
 
            if gr is None:
 
                break
 
            if cnt == parents_recursion_limit:
 
                # this will prevent accidental infinit loops
 
                log.error('group nested more than %s' %
 
                          parents_recursion_limit)
 
                break
 

	
 
            groups.insert(0, gr)
 
        return groups
 

	
 
    @property
 
    def children(self):
 
        return RepoGroup.query().filter(RepoGroup.parent_group == self)
 

	
 
    @property
 
    def name(self):
 
        return self.group_name.split(RepoGroup.url_sep())[-1]
 

	
 
    @property
 
    def full_path(self):
 
        return self.group_name
 

	
 
    @property
 
    def full_path_splitted(self):
 
        return self.group_name.split(RepoGroup.url_sep())
 

	
 
    @property
 
    def repositories(self):
 
        return Repository.query()\
 
                .filter(Repository.group == self)\
 
                .order_by(Repository.repo_name)
 

	
 
    @property
 
    def repositories_recursive_count(self):
 
        cnt = self.repositories.count()
 

	
 
        def children_count(group):
 
            cnt = 0
 
            for child in group.children:
 
                cnt += child.repositories.count()
 
                cnt += children_count(child)
 
            return cnt
 

	
 
        return cnt + children_count(self)
 

	
 
    def recursive_groups_and_repos(self):
 
        """
 
        Recursive return all groups, with repositories in those groups
 
        """
 
        all_ = []
 

	
 
        def _get_members(root_gr):
 
            for r in root_gr.repositories:
 
                all_.append(r)
 
            childs = root_gr.children.all()
 
            if childs:
 
                for gr in childs:
 
                    all_.append(gr)
 
                    _get_members(gr)
 

	
 
        _get_members(self)
 
        return [self] + all_
 

	
 
    def get_new_name(self, group_name):
 
        """
 
        returns new full group name based on parent and new name
 

	
 
        :param group_name:
 
        """
 
        path_prefix = (self.parent_group.full_path_splitted if
 
                       self.parent_group else [])
 
        return RepoGroup.url_sep().join(path_prefix + [group_name])
 

	
 

	
 
class Permission(Base, BaseModel):
 
    __tablename__ = 'permissions'
 
    __table_args__ = (
 
        Index('p_perm_name_idx', 'permission_name'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'},
 
    )
 
    PERMS = [
 
        ('repository.none', _('Repository no access')),
 
        ('repository.read', _('Repository read access')),
 
        ('repository.write', _('Repository write access')),
 
        ('repository.admin', _('Repository admin access')),
 

	
 
        ('group.none', _('Repositories Group no access')),
 
        ('group.read', _('Repositories Group read access')),
 
        ('group.write', _('Repositories Group write access')),
 
        ('group.admin', _('Repositories Group admin access')),
 

	
 
        ('hg.admin', _('RhodeCode Administrator')),
 
        ('hg.create.none', _('Repository creation disabled')),
 
        ('hg.create.repository', _('Repository creation enabled')),
 
        ('hg.fork.none', _('Repository forking disabled')),
 
        ('hg.fork.repository', _('Repository forking enabled')),
 
        ('hg.register.none', _('Register disabled')),
 
        ('hg.register.manual_activate', _('Register new user with RhodeCode '
 
                                          'with manual activation')),
 

	
 
        ('hg.register.auto_activate', _('Register new user with RhodeCode '
 
                                        'with auto activation')),
 
    ]
 

	
 
    # defines which permissions are more important higher the more important
 
    PERM_WEIGHTS = {
 
        'repository.none': 0,
 
        'repository.read': 1,
 
        'repository.write': 3,
 
        'repository.admin': 4,
 

	
 
        'group.none': 0,
 
        'group.read': 1,
 
        'group.write': 3,
 
        'group.admin': 4,
 

	
 
        'hg.fork.none': 0,
 
        'hg.fork.repository': 1,
 
        'hg.create.none': 0,
 
        'hg.create.repository':1
 
    }
 

	
 
    permission_id = Column("permission_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    permission_name = Column("permission_name", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 
    permission_longname = Column("permission_longname", String(255, convert_unicode=False, assert_unicode=None), nullable=True, unique=None, default=None)
 

	
 
    def __unicode__(self):
 
        return u"<%s('%s:%s')>" % (
 
            self.__class__.__name__, self.permission_id, self.permission_name
 
        )
 

	
 
    @classmethod
 
    def get_by_key(cls, key):
 
        return cls.query().filter(cls.permission_name == key).scalar()
 

	
 
    @classmethod
 
    def get_default_perms(cls, default_user_id):
 
        q = Session().query(UserRepoToPerm, Repository, cls)\
 
         .join((Repository, UserRepoToPerm.repository_id == Repository.repo_id))\
 
         .join((cls, UserRepoToPerm.permission_id == cls.permission_id))\
 
         .filter(UserRepoToPerm.user_id == default_user_id)
 

	
 
        return q.all()
 

	
 
    @classmethod
 
    def get_default_group_perms(cls, default_user_id):
 
        q = Session().query(UserRepoGroupToPerm, RepoGroup, cls)\
 
         .join((RepoGroup, UserRepoGroupToPerm.group_id == RepoGroup.group_id))\
 
         .join((cls, UserRepoGroupToPerm.permission_id == cls.permission_id))\
 
         .filter(UserRepoGroupToPerm.user_id == default_user_id)
 

	
 
        return q.all()
 

	
 

	
 
class UserRepoToPerm(Base, BaseModel):
 
    __tablename__ = 'repo_to_perm'
 
    __table_args__ = (
 
        UniqueConstraint('user_id', 'repository_id', 'permission_id'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'}
 
    )
 
    repo_to_perm_id = Column("repo_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
 
    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
 
    repository_id = Column("repository_id", Integer(), ForeignKey('repositories.repo_id'), nullable=False, unique=None, default=None)
 

	
 
    user = relationship('User')
 
    repository = relationship('Repository')
 
    permission = relationship('Permission')
 

	
 
    @classmethod
 
    def create(cls, user, repository, permission):
 
        n = cls()
 
        n.user = user
 
        n.repository = repository
 
        n.permission = permission
 
        Session().add(n)
 
        return n
 

	
 
    def __unicode__(self):
 
        return u'<user:%s => %s >' % (self.user, self.repository)
 

	
 

	
 
class UserToPerm(Base, BaseModel):
 
    __tablename__ = 'user_to_perm'
 
    __table_args__ = (
 
        UniqueConstraint('user_id', 'permission_id'),
 
        {'extend_existing': True, 'mysql_engine': 'InnoDB',
 
         'mysql_charset': 'utf8'}
 
    )
 
    user_to_perm_id = Column("user_to_perm_id", Integer(), nullable=False, unique=True, default=None, primary_key=True)
 
    user_id = Column("user_id", Integer(), ForeignKey('users.user_id'), nullable=False, unique=None, default=None)
 
    permission_id = Column("permission_id", Integer(), ForeignKey('permissions.permission_id'), nullable=False, unique=None, default=None)
 

	
 
    user = relationship('User')
 
    permission = relationship('Permission', lazy='joined')
rhodecode/templates/admin/admin.html
Show inline comments
 
## -*- coding: utf-8 -*-
 
<%inherit file="/base/base.html"/>
 

	
 
<%def name="title()">
 
    ${_('Admin journal')} - ${c.rhodecode_name}
 
</%def>
 

	
 
<%def name="breadcrumbs_links()">
 
    <form id="filter_form">
 
    <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" value="${c.search_term or _('quick filter...')}"/>
 
    <input type='submit' value="${_('filter')}" class="ui-btn"/>
 
    ${_('Admin journal')}
 
    <input type='submit' value="${_('filter')}" class="ui-btn" style="padding:0px 2px 0px 2px;margin:0px"/>
 
    ${_('Admin journal')} - ${ungettext('%s entry', '%s entries', c.users_log.item_count) % (c.users_log.item_count)}
 
    </form>
 
    ${h.end_form()}
 
</%def>
 

	
 
<%def name="page_nav()">
 
	${self.menu('admin')}
 
</%def>
 
<%def name="main()">
 
<div class="box">
 
	<!-- box / title -->
 
	<div class="title">
 
	    ${self.breadcrumbs()}
 
	</div>
 
	<!-- end box / title -->
 
	<div class="table">
 
	    <div id="user_log">
 
	        ${c.log_data}
 
	    </div>
 
	</div>
 
</div>
 

	
 
<script>
 
YUE.on('q_filter','click',function(){
 
    YUD.get('q_filter').value = '';
 
});
 
YUE.on('filter_form','submit',function(e){
 
	YUE.preventDefault(e)
 
    var val = YUD.get('q_filter').value;
 
	window.location = "${url.current(filter='__FILTER__')}".replace('__FILTER__',val);
 
 });
 
</script>
 
</%def>
 

	
rhodecode/templates/admin/admin_log.html
Show inline comments
 
## -*- coding: utf-8 -*-
 
%if c.users_log:
 
<table>
 
	<tr>
 
		<th class="left">${_('Username')}</th>
 
		<th class="left">${_('Action')}</th>
 
		<th class="left">${_('Repository')}</th>
 
		<th class="left">${_('Date')}</th>
 
		<th class="left">${_('From IP')}</th>
 
	</tr>
 

	
 
	%for cnt,l in enumerate(c.users_log):
 
	<tr class="parity${cnt%2}">
 
		<td>${h.link_to(l.user.username,h.url('edit_user', id=l.user.user_id))}</td>
 
		<td>
 
        %if l.user is not None:
 
          ${h.link_to(l.user.username,h.url('edit_user', id=l.user.user_id))}
 
        %else:
 
          ${l.username}
 
        %endif    
 
        </td>
 
		<td>${h.action_parser(l)[0]()}
 
		  <div class="journal_action_params">
 
            ${h.literal(h.action_parser(l)[1]())}
 
          </div>
 
		</td>
 
		<td>
 
		%if l.repository is not None:
 
		  ${h.link_to(l.repository.repo_name,h.url('summary_home',repo_name=l.repository.repo_name))}
 
		%else:
 
		  ${l.repository_name}
 
		%endif
 
		</td>
 

	
 
		<td>${h.fmt_date(l.action_date)}</td>
 
		<td>${l.user_ip}</td>
 
	</tr>
 
	%endfor
 
</table>
 

	
 
<script type="text/javascript">
 
  YUE.onDOMReady(function(){
 
	YUE.delegate("user_log","click",function(e, matchedEl, container){
 
		ypjax(e.target.href,"user_log",function(){
 
			show_more_event();
 
			tooltip_activate();
 
			show_changeset_tooltip();
 
		});
 
		YUE.preventDefault(e);
 
	},'.pager_link');
 

	
 
	YUE.delegate("user_log","click",function(e,matchedEl,container){
 
	      var el = e.target;
 
	      YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
 
	      YUD.setStyle(el.parentNode,'display','none');
 
	  },'.show_more');
 
  });
 
</script>
 

	
 
<div class="pagination-wh pagination-left">
 
${c.users_log.pager('$link_previous ~2~ $link_next')}
 
</div>
 
%else:
 
	${_('No actions yet')}
 
%endif
rhodecode/tests/fixtures/journal_dump.csv
Show inline comments
 
new file 100644
 
user_log_id,user_id,username,repository_id,repository_name,user_ip,action,action_date
 
40,11,bobbbb,7,Something,58.96.60.131,push:8ae497884817c13097315b1740f2dd4dc87146da,2012-06-20 06:24:58.397209
 
41,3,demo,8,Test_Repo,"",started_following_repo,2012-06-20 09:28:05.148974
 
42,3,demo,8,Test_Repo,"",user_created_repo,2012-06-20 09:28:05.16412
 
43,3,demo,8,Test_Repo,"",push_local:ef71a9202c55,2012-06-20 10:55:45.001052
 
44,3,demo,8,Test_Repo,"",push_local:38d49edbd7b2,2012-06-20 10:56:51.749613
 
45,3,demo,9,demo_repo,"",started_following_repo,2012-06-20 11:32:14.24928
 
46,3,demo,9,demo_repo,"",user_created_repo,2012-06-20 11:32:14.263506
 
47,3,demo,9,demo_repo,"",push_local:33ee55de14bc,2012-06-20 11:33:13.23204
 
48,3,demo,9,demo_repo,130.225.93.59,pull,2012-06-20 12:46:47.218691
 
49,3,demo,9,demo_repo,130.225.93.59,pull,2012-06-20 12:48:09.634995
 
50,3,demo,9,demo_repo,130.225.93.59,pull,2012-06-20 12:55:14.751441
 
51,3,demo,9,demo_repo,130.225.93.59,pull,2012-06-20 13:21:12.623288
 
56,3,demo,9,demo_repo,130.225.93.59,pull,2012-06-20 15:12:46.55823
 
57,3,demo,12,rawr,"",started_following_repo,2012-06-20 17:16:42.947936
 
58,3,demo,12,rawr,"",user_created_repo,2012-06-20 17:16:42.962133
 
59,3,demo,12,rawr,"",stopped_following_repo,2012-06-20 17:17:12.759495
 
60,3,demo,12,rawr,"",started_following_repo,2012-06-20 17:17:28.877751
 
62,3,demo,12,rawr,"",user_forked_repo:fork-rawr,2012-06-20 17:17:48.439005
 
64,3,demo,14,fork-demo_repo-cubed,"",started_following_repo,2012-06-20 18:54:02.751941
 
65,3,demo,9,demo_repo,"",user_forked_repo:fork-demo_repo-cubed,2012-06-20 18:54:02.767968
 
66,3,demo,14,fork-demo_repo-cubed,"",user_created_fork:fork-demo_repo-cubed,2012-06-20 18:54:02.777189
 
67,1,default,4,fork-fork-test,194.105.98.146,pull,2012-06-20 21:53:57.018888
 
68,1,default,7,Something,54.247.183.89,pull,2012-06-21 01:11:19.524998
 
69,3,demo,15,wibblewobble,"",started_following_repo,2012-06-21 10:21:31.937511
 
70,3,demo,15,wibblewobble,"",user_created_repo,2012-06-21 10:21:31.952874
 
71,3,demo,15,wibblewobble,"",push_local:c1953b3f4981,2012-06-21 10:23:05.881392
 
72,3,demo,8,Test_Repo,"",user_commented_revision:38d49edbd7b2599acf9ef40198d9107616c1faea,2012-06-21 21:11:46.159601
 
73,3,demo,8,Test_Repo,"",push_local:1b6b9ca4d1e2,2012-06-21 21:13:03.715136
 
74,3,demo,8,Test_Repo,"",user_commented_revision:1b6b9ca4d1e2776d8229f032c3a3136ae8c709a5,2012-06-21 21:13:32.771404
 
75,3,demo,8,Test_Repo,"",user_commented_revision:1b6b9ca4d1e2776d8229f032c3a3136ae8c709a5,2012-06-21 21:13:58.118806
 
76,1,default,4,fork-fork-test,98.215.125.44,pull,2012-06-22 09:04:39.8341
 
77,1,default,1,test,98.215.125.44,pull,2012-06-22 09:06:34.310867
 
78,3,demo,16,My-Demo-Test,"",started_following_repo,2012-06-22 09:24:25.528203
 
79,3,demo,16,My-Demo-Test,"",user_created_repo,2012-06-22 09:24:25.544844
 
80,3,demo,16,My-Demo-Test,"",push_local:c011a9245a0a,2012-06-22 09:25:51.981168
 
81,3,demo,17,fork-test1,"",started_following_repo,2012-06-22 12:45:00.782089
 
82,3,demo,7,Something,"",user_forked_repo:fork-test1,2012-06-22 12:45:00.874723
 
83,3,demo,17,fork-test1,"",user_created_fork:fork-test1,2012-06-22 12:45:00.888746
 
84,1,default,17,fork-test1,193.111.227.10,pull,2012-06-22 12:46:05.626038
 
85,3,demo,17,fork-test1,"",push_local:fbba7ec0a373,2012-06-22 12:47:02.869839
 
86,3,demo,,testuser,"",started_following_repo,2012-06-22 13:07:21.784074
 
87,3,demo,,testuser,"",user_created_repo,2012-06-22 13:07:21.797918
 
52,12,asddsaasd,,asdasd,"",started_following_repo,2012-06-20 13:29:33.432553
 
53,12,asddsaasd,,asdasd,"",user_created_repo,2012-06-20 13:29:33.443905
 
54,3,demo,,foo-bar,"",started_following_repo,2012-06-20 13:41:00.903917
 
55,3,demo,,foo-bar,"",user_created_repo,2012-06-20 13:41:00.919042
 
61,3,demo,,fork-rawr,"",started_following_repo,2012-06-20 17:17:48.419615
 
63,3,demo,,fork-rawr,"",user_created_fork:fork-rawr,2012-06-20 17:17:48.45108
 
88,3,demo,,testuser,"",user_deleted_repo,2012-06-22 13:08:17.608089
 
89,3,demo,8,Test_Repo,"",stopped_following_repo,2012-06-22 13:09:37.992254
 
90,3,demo,8,Test_Repo,"",started_following_repo,2012-06-22 13:09:39.613543
 
91,3,demo,8,Test_Repo,"",stopped_following_repo,2012-06-22 13:09:41.493402
 
92,3,demo,19,testmaster,"",started_following_repo,2012-06-22 13:10:21.695641
 
93,3,demo,19,testmaster,"",user_created_repo,2012-06-22 13:10:21.708814
 
96,3,demo,19,testmaster,"",push_local:b33786b10a28,2012-06-22 13:15:36.222686
 
104,3,demo,24,fork-Something,"",started_following_repo,2012-06-25 18:03:33.068935
 
105,3,demo,7,Something,"",user_forked_repo:fork-Something,2012-06-25 18:03:33.13689
 
106,3,demo,24,fork-Something,"",user_created_fork:fork-Something,2012-06-25 18:03:33.149499
 
107,3,demo,8,Test_Repo,"",user_commented_revision:1b6b9ca4d1e2776d8229f032c3a3136ae8c709a5,2012-06-25 18:04:15.229245
 
108,15,Vipous,25,My1,"",started_following_repo,2012-06-25 22:03:18.626137
 
109,15,Vipous,25,My1,"",user_created_repo,2012-06-25 22:03:18.64231
 
110,15,Vipous,25,My1,"",push_local:7de476a79614,2012-06-25 22:03:56.832111
 
111,3,demo,26,test12,"",started_following_repo,2012-06-26 04:49:54.757548
 
112,3,demo,26,test12,"",user_created_repo,2012-06-26 04:49:54.772195
 
113,1,default,26,test12,119.75.53.154,pull,2012-06-26 04:50:18.237028
 
114,3,demo,26,test12,119.75.53.154,push:50bafc0269a534dd41937214d0b35a43f65d8251,2012-06-26 04:51:04.26479
 
115,17,pribeiro,,sync,"",started_following_repo,2012-06-26 11:11:45.473209
 
116,17,pribeiro,,sync,"",user_created_repo,2012-06-26 11:11:45.487411
 
117,17,pribeiro,,sync,"",user_deleted_repo,2012-06-26 11:13:46.254567
 
118,18,admin_xanroot,28,new_repo,"",started_following_repo,2012-06-26 14:39:12.939952
 
119,18,admin_xanroot,28,new_repo,"",user_created_repo,2012-06-26 14:39:12.954647
 
120,2,admin,29,otro-test,"",started_following_repo,2012-06-26 19:44:05.282141
 
121,2,admin,29,otro-test,"",admin_created_repo,2012-06-26 19:44:05.29657
 
122,2,admin,29,otro-test,"",admin_updated_repo,2012-06-26 19:44:47.598164
 
123,1,default,29,otro-test,190.84.240.187,push:aeb60b7e53696fa8deaaf4881cf02cdbf4698bbc,2012-06-26 19:47:33.677685
 
124,22,sven-teichmann,30,Test,"",started_following_repo,2012-06-27 12:07:55.455967
 
125,22,sven-teichmann,30,Test,"",user_created_repo,2012-06-27 12:07:55.471798
 
126,3,demo,31,fork-new_repo,"",started_following_repo,2012-06-27 16:22:20.091073
 
127,3,demo,28,new_repo,"",user_forked_repo:fork-new_repo,2012-06-27 16:22:20.104674
 
128,3,demo,31,fork-new_repo,"",user_created_fork:fork-new_repo,2012-06-27 16:22:20.11418
 
129,3,demo,32,big-project,"",started_following_repo,2012-06-27 16:37:55.369402
 
130,3,demo,32,big-project,"",user_created_repo,2012-06-27 16:37:55.383717
 
131,3,demo,32,big-project,195.238.92.121,push:5645e36ef4c9dbdd31709f1d234df008a8a8ce8c,2012-06-27 16:39:07.148939
 
132,3,demo,32,big-project,195.238.92.121,push:06d5302c4830e5af52f06c462f11f75107b2a1ff,2012-06-27 16:39:45.482592
 
133,3,demo,32,big-project,"",user_commented_revision:06d5302c4830e5af52f06c462f11f75107b2a1ff,2012-06-27 16:42:21.533609
 
134,3,demo,32,big-project,"",user_commented_revision:06d5302c4830e5af52f06c462f11f75107b2a1ff,2012-06-27 16:42:48.278721
 
135,3,demo,32,big-project,"",stopped_following_repo,2012-06-27 16:46:16.105454
 
136,3,demo,32,big-project,"",started_following_repo,2012-06-27 16:46:17.496644
 
137,3,demo,32,big-project,"",stopped_following_repo,2012-06-27 16:46:19.299402
 
138,3,demo,32,big-project,"",started_following_repo,2012-06-27 16:46:20.235067
 
139,3,demo,32,big-project,"",user_commented_pull_request:3,2012-06-27 17:25:45.106764
 
140,3,demo,33,fork-big-project,"",started_following_repo,2012-06-27 17:30:03.65222
 
141,3,demo,32,big-project,"",user_forked_repo:fork-big-project,2012-06-27 17:30:03.666404
 
142,3,demo,33,fork-big-project,"",user_created_fork:fork-big-project,2012-06-27 17:30:03.676956
 
143,3,demo,34,a,"",started_following_repo,2012-06-27 17:38:09.019648
 
144,3,demo,34,a,"",user_created_repo,2012-06-27 17:38:09.0339
 
145,3,demo,35,fork-Something22,"",started_following_repo,2012-06-28 11:00:39.678572
 
146,3,demo,7,Something,"",user_forked_repo:fork-Something22,2012-06-28 11:00:39.737584
 
147,3,demo,35,fork-Something22,"",user_created_fork:fork-Something22,2012-06-28 11:00:39.754509
 
148,3,demo,36,bootstrap,"",started_following_repo,2012-06-29 08:21:06.920203
 
149,3,demo,36,bootstrap,"",user_created_repo,2012-06-29 08:21:06.932926
 
150,18,admin_xanroot,28,new_repo,"",stopped_following_repo,2012-06-29 13:24:05.476554
 
151,18,admin_xanroot,28,new_repo,"",started_following_repo,2012-06-29 13:24:07.796049
 
152,18,admin_xanroot,37,ааввя,"",started_following_repo,2012-06-29 14:29:18.52356
 
153,18,admin_xanroot,37,ааввя,"",user_created_repo,2012-06-29 14:29:18.536725
 
154,2,admin,38,code-review-test,"",started_following_repo,2012-06-29 14:51:32.715801
 
155,2,admin,38,code-review-test,"",admin_created_repo,2012-06-29 14:51:32.730258
 
156,2,admin,1,test,"",user_commented_pull_request:1,2012-06-29 14:54:59.436222
 
157,2,admin,1,test,"",user_commented_pull_request:1,2012-06-29 14:55:14.228553
 
158,2,admin,1,test,"",user_commented_pull_request:1,2012-06-29 14:55:22.443143
 
159,2,admin,1,test,"",user_commented_pull_request:1,2012-06-29 14:55:37.609157
 
160,2,admin,3,fork-test,"",user_commented_revision:8af86cb62c34b04cf2b1e3c9fcd2aa19e2e79caa,2012-06-29 14:56:01.991353
 
161,1,default,38,code-review-test,62.116.219.97,pull,2012-06-29 14:57:31.272853
 
162,2,admin,39,fork-code-review-test,"",started_following_repo,2012-06-29 15:03:28.825569
 
163,2,admin,38,code-review-test,"",user_forked_repo:fork-code-review-test,2012-06-29 15:03:28.875867
 
164,2,admin,39,fork-code-review-test,"",user_created_fork:fork-code-review-test,2012-06-29 15:03:28.883669
 
165,2,admin,39,fork-code-review-test,62.116.219.97,push:ac19ef61aab0b008acb5dac5d53457cbd278d927,2012-06-29 15:03:44.690869
 
166,2,admin,38,code-review-test,"",user_commented_pull_request:5,2012-06-29 15:07:50.753441
 
167,2,admin,39,fork-code-review-test,"",user_commented_revision:ac19ef61aab0b008acb5dac5d53457cbd278d927,2012-06-29 15:08:06.700958
 
168,2,admin,38,code-review-test,"",user_commented_pull_request:5,2012-06-29 15:08:20.290949
 
169,2,admin,38,code-review-test,"",user_commented_pull_request:5,2012-06-29 15:08:43.746906
 
170,3,demo,40,group/fork-a,"",started_following_repo,2012-07-01 18:28:49.022357
 
171,3,demo,34,a,"",user_forked_repo:group/fork-a,2012-07-01 18:28:49.039621
 
172,3,demo,40,group/fork-a,"",user_created_fork:group/fork-a,2012-07-01 18:28:49.050748
 
173,3,demo,16,My-Demo-Test,"",push_local:5ac30fe040bd,2012-07-02 17:29:26.91197
 
174,1,default,36,bootstrap,78.53.1.77,pull,2012-07-02 19:33:15.148459
 
175,2,admin,,asdasd,"",admin_deleted_repo,2012-07-03 00:54:27.51389
 
94,3,demo,,testclone,"",started_following_repo,2012-06-22 13:10:54.479092
 
101,14,rune,,fork-rune-test,"",started_following_repo,2012-06-25 15:06:20.402391
 
97,3,demo,,dummy,"",started_following_repo,2012-06-25 00:12:56.20161
 
98,3,demo,,dummy,"",user_created_repo,2012-06-25 00:12:56.210618
 
99,14,rune,,rune-test,"",started_following_repo,2012-06-25 15:05:18.894561
 
100,14,rune,,rune-test,"",user_created_repo,2012-06-25 15:05:18.908953
 
102,14,rune,,rune-test,"",user_forked_repo:fork-rune-test,2012-06-25 15:06:20.418213
 
237,1,default,36,bootstrap,92.229.108.18,pull,2012-07-11 23:16:28.235183
 
95,3,demo,,testclone,"",user_created_repo,2012-06-22 13:10:54.492868
 
177,2,admin,,testclone,"",admin_deleted_repo,2012-07-03 00:54:44.781032
 
103,14,rune,,fork-rune-test,"",user_created_fork:fork-rune-test,2012-06-25 15:06:20.429444
 
178,2,admin,,fork-rune-test,"",admin_deleted_repo,2012-07-03 00:54:53.395495
 
179,2,admin,,dummy,"",admin_deleted_repo,2012-07-03 00:54:56.740108
 
180,2,admin,,foo-bar,"",admin_deleted_repo,2012-07-03 00:54:59.755216
 
238,40,cowwoc,54,glib,"",started_following_repo,2012-07-12 00:09:07.867216
 
182,15,Vipous,25,My1,"",push_local:96546c4c668d,2012-07-03 22:52:15.186673
 
183,15,Vipous,25,My1,"",push_local:f650cc084095,2012-07-03 22:53:20.761064
 
184,15,Vipous,25,My1,"",push_local:e55af939aaf5,2012-07-03 22:54:18.480735
 
185,28,razpdx,38,code-review-test,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-07-04 08:10:08.771284
 
186,28,razpdx,41,fork-code-review-test1111111,"",started_following_repo,2012-07-04 08:11:23.633652
 
187,28,razpdx,38,code-review-test,"",user_forked_repo:fork-code-review-test1111111,2012-07-04 08:11:25.10245
 
188,28,razpdx,41,fork-code-review-test1111111,"",user_created_fork:fork-code-review-test1111111,2012-07-04 08:11:25.110291
 
189,3,demo,43,bar,"",started_following_repo,2012-07-05 14:37:38.394712
 
190,3,demo,43,bar,"",user_created_repo,2012-07-05 14:37:38.404527
 
191,3,demo,42,foo,"",started_following_repo,2012-07-05 14:38:19.351357
 
192,3,demo,42,foo,"",user_created_repo,2012-07-05 14:38:19.367056
 
193,3,demo,9,demo_repo,"",push_local:14fcc9365f2a,2012-07-05 22:53:20.216762
 
194,31,jtiai,44,diff-test,"",started_following_repo,2012-07-06 11:23:24.475194
 
195,31,jtiai,44,diff-test,"",user_created_repo,2012-07-06 11:23:24.491639
 
196,31,jtiai,44,diff-test,62.240.70.253,push:bca174fa48db2eb05db5bd4532191dac269e97b2,2012-07-06 11:25:02.929509
 
197,31,jtiai,44,diff-test,62.240.70.253,push:50daf150549b8d48676889dcb713f1f4e0e4bc9d,2012-07-06 11:26:14.260627
 
198,2,admin,44,diff-test,"",admin_updated_repo,2012-07-06 19:57:44.363539
 
199,2,admin,44,diff-test,"",admin_updated_repo,2012-07-06 19:57:48.132041
 
200,1,default,44,diff-test,78.53.7.202,pull,2012-07-06 19:58:55.97104
 
201,32,shabutora,45,group/fork-bootstrap,"",started_following_repo,2012-07-07 07:28:38.272328
 
202,32,shabutora,36,bootstrap,"",user_forked_repo:group/fork-bootstrap,2012-07-07 07:28:39.509986
 
203,32,shabutora,45,group/fork-bootstrap,"",user_created_fork:group/fork-bootstrap,2012-07-07 07:28:39.523403
 
206,3,demo,,GitRepoTest,"",started_following_repo,2012-07-09 15:19:28.134838
 
207,3,demo,,GitRepoTest,"",user_created_repo,2012-07-09 15:19:28.145858
 
208,3,demo,,GitRepoTest,"",push_local:5caba17c3e28,2012-07-09 15:19:59.181736
 
209,3,demo,,GitRepoTest,"",user_deleted_repo,2012-07-09 15:22:02.989814
 
210,3,demo,32,big-project,"",user_commented_revision:06d5302c4830e5af52f06c462f11f75107b2a1ff,2012-07-09 21:43:51.82571
 
211,3,demo,32,big-project,"",user_commented_revision:06d5302c4830e5af52f06c462f11f75107b2a1ff,2012-07-09 21:43:59.440606
 
212,3,demo,32,big-project,"",user_commented_revision:06d5302c4830e5af52f06c462f11f75107b2a1ff,2012-07-09 21:44:06.259449
 
213,3,demo,15,wibblewobble,"",user_commented_revision:c1953b3f4981e57d0031f4307f70209706f204f3,2012-07-09 21:45:16.908265
 
214,3,demo,15,wibblewobble,"",user_commented_revision:c1953b3f4981e57d0031f4307f70209706f204f3,2012-07-09 21:45:29.881903
 
217,2,admin,,rm__20120709_152203_19234__GitRepoTest,"",started_following_repo,2012-07-11 01:23:59.921383
 
218,2,admin,,rm__20120709_152203_19234__GitRepoTest,"",admin_deleted_repo,2012-07-11 01:25:33.983055
 
221,38,zenqw,51,fork-test-12345,"",started_following_repo,2012-07-11 13:05:17.345386
 
222,38,zenqw,1,test,"",user_forked_repo:fork-test-12345,2012-07-11 13:05:17.362995
 
223,38,zenqw,51,fork-test-12345,"",user_created_fork:fork-test-12345,2012-07-11 13:05:17.370362
 
224,38,zenqw,51,fork-test-12345,217.153.157.250,pull,2012-07-11 13:05:51.790618
 
225,38,zenqw,51,fork-test-12345,217.153.157.250,"push:ebf2e5c36ee3008d6fde8376e0dc2859c764aeef,6854386e16136812b9219e9d5e2971c87419eafa,46371e1dff2357d51e581e55882415bd18a5db8c",2012-07-11 13:07:46.354331
 
226,38,zenqw,51,fork-test-12345,217.153.157.250,push:4db220a6e8a720ffd78d1fc383e3361e9f85e930,2012-07-11 13:10:13.793368
 
227,38,zenqw,1,test,"",user_commented_pull_request:6,2012-07-11 13:11:54.473213
 
228,38,zenqw,1,test,"",user_commented_pull_request:6,2012-07-11 13:12:03.64804
 
229,38,zenqw,52,fork-fork-test-12345_2,"",started_following_repo,2012-07-11 13:14:31.237173
 
230,38,zenqw,51,fork-test-12345,"",user_forked_repo:fork-fork-test-12345_2,2012-07-11 13:14:31.2571
 
231,38,zenqw,52,fork-fork-test-12345_2,"",user_created_fork:fork-fork-test-12345_2,2012-07-11 13:14:31.268722
 
232,38,zenqw,52,fork-fork-test-12345_2,217.153.157.250,pull,2012-07-11 13:15:52.326756
 
233,38,zenqw,52,fork-fork-test-12345_2,217.153.157.250,"push:b9567e91f6ee7cd18b6332608a5a0ed12256ea48,2f709872121b0875b02f4fbfafa8fccd4c0613db",2012-07-11 13:16:51.063259
 
234,38,zenqw,51,fork-test-12345,"",user_commented_pull_request:7,2012-07-11 13:18:04.300327
 
239,40,cowwoc,54,glib,"",user_created_repo,2012-07-12 00:09:07.883466
 
240,3,demo,38,code-review-test,"",user_commented_pull_request:8,2012-07-12 00:50:50.791122
 
241,3,demo,38,code-review-test,"",user_commented_pull_request:8,2012-07-12 00:51:04.795167
 
242,3,demo,38,code-review-test,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-07-12 13:41:59.717658
 
243,43,lpyedge,55,group/brhg,"",started_following_repo,2012-07-12 15:09:28.550696
 
244,43,lpyedge,55,group/brhg,"",user_created_repo,2012-07-12 15:09:28.562524
 
245,43,lpyedge,56,brgit,"",started_following_repo,2012-07-12 15:18:17.687605
 
246,43,lpyedge,56,brgit,"",user_created_repo,2012-07-12 15:18:17.702136
 
247,1,default,34,a,54.247.183.89,pull,2012-07-12 16:53:15.165512
 
248,45,krhodecode,1,test,"",user_commented_revision:ef02269209cd431c0cd0ee929ba37ae895651d69,2012-07-12 23:09:25.38717
 
249,45,krhodecode,42,foo,"",user_commented_revision:ca953e8c5c1ada44e9a8f945a0a6999d2f44310d,2012-07-12 23:14:07.819338
 
250,45,krhodecode,57,SuperProject,"",started_following_repo,2012-07-12 23:17:38.213634
 
251,45,krhodecode,57,SuperProject,"",user_created_repo,2012-07-12 23:17:38.229359
 
252,45,krhodecode,57,SuperProject,216.51.137.66,push:a3188ce9ed64822ceae497665910c2e18cddf021,2012-07-12 23:23:23.111788
 
253,3,demo,38,code-review-test,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-07-13 14:22:00.003158
 
254,46,snazy2000,58,group/Test,"",started_following_repo,2012-07-13 19:14:31.959033
 
255,46,snazy2000,58,group/Test,"",user_created_repo,2012-07-13 19:14:31.972509
 
256,2,admin,1,test,"",user_commented_revision:ef02269209cd431c0cd0ee929ba37ae895651d69,2012-07-15 03:03:17.100702
 
204,34,qqqqq,,zaraza,"",started_following_repo,2012-07-08 01:43:26.053084
 
205,34,qqqqq,,zaraza,"",user_created_repo,2012-07-08 01:43:26.067756
 
215,35,kvaster,,asd,"",started_following_repo,2012-07-09 22:03:29.676651
 
216,35,kvaster,,asd,"",user_created_repo,2012-07-09 22:03:29.688872
 
219,37,tester,,test2,"",started_following_repo,2012-07-11 11:07:19.065559
 
220,37,tester,,test2,"",user_created_repo,2012-07-11 11:07:19.080323
 
257,2,admin,38,code-review-test,"",user_commented_pull_request:8,2012-07-15 03:21:36.545532
 
258,2,admin,38,code-review-test,"",user_closed_pull_request:8,2012-07-15 03:21:36.556543
 
259,3,demo,59,fasdf,"",started_following_repo,2012-07-15 12:27:25.654257
 
260,3,demo,59,fasdf,"",user_created_repo,2012-07-15 12:27:25.670633
 
261,3,demo,60,group/aaa1,"",started_following_repo,2012-07-15 12:27:42.824398
 
262,3,demo,60,group/aaa1,"",user_created_repo,2012-07-15 12:27:42.834237
 
263,3,demo,34,a,"",user_updated_repo,2012-07-15 13:47:35.934007
 
264,3,demo,61,group/testowe-repo,"",started_following_repo,2012-07-15 13:54:10.774348
 
265,3,demo,61,group/testowe-repo,"",user_created_repo,2012-07-15 13:54:10.784709
 
266,3,demo,61,group/testowe-repo,109.173.164.98,pull,2012-07-15 13:55:19.296932
 
267,3,demo,61,group/testowe-repo,"",user_updated_repo,2012-07-15 13:57:16.969058
 
235,2,admin,,rm__20120711_012534_20311__rm__20120709_152203_19234__GitRepoTest,"",started_following_repo,2012-07-11 22:50:22.745467
 
268,47,testuser,62,My-demo,"",started_following_repo,2012-07-15 20:00:47.633404
 
269,47,testuser,62,My-demo,"",user_created_repo,2012-07-15 20:00:47.64378
 
270,48,volcan,63,test9,"",started_following_repo,2012-07-15 20:45:08.177239
 
271,48,volcan,63,test9,"",user_created_repo,2012-07-15 20:45:08.191869
 
272,48,volcan,63,test9,"",push_local:7e10d450821a,2012-07-15 20:46:42.370199
 
273,48,volcan,63,test9,"",push_local:049788cfb4b5,2012-07-15 20:48:26.176589
 
274,48,volcan,63,test9,"",user_commented_revision:049788cfb4b5254813312395aa380e988c32bbfb,2012-07-15 20:48:42.031217
 
275,48,volcan,64,fork-test9,"",started_following_repo,2012-07-15 20:51:55.738241
 
276,48,volcan,63,test9,"",user_forked_repo:fork-test9,2012-07-15 20:51:55.749793
 
277,48,volcan,64,fork-test9,"",user_created_fork:fork-test9,2012-07-15 20:51:55.757696
 
278,3,demo,65,COMMON,"",started_following_repo,2012-07-16 14:38:36.330869
 
279,3,demo,65,COMMON,"",user_created_repo,2012-07-16 14:38:36.341796
 
280,3,demo,39,fork-code-review-test,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-07-17 09:26:23.907503
 
281,3,demo,39,fork-code-review-test,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-07-17 09:26:58.039752
 
282,3,demo,39,fork-code-review-test,"",user_commented_revision:c5ed575f313788acd04614e3e0c13a5cdf5d7b39,2012-07-17 09:29:02.389958
 
283,3,demo,39,fork-code-review-test,"",user_commented_revision:c5ed575f313788acd04614e3e0c13a5cdf5d7b39,2012-07-17 09:29:39.287759
 
284,3,demo,38,code-review-test,"",user_commented_revision:0e4171fdb9d4267aa1145b840529d75673ea553d,2012-07-17 11:56:13.655476
 
285,3,demo,38,code-review-test,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-07-17 11:57:32.735913
 
286,52,prefer,39,fork-code-review-test,"",user_commented_revision:ac19ef61aab0b008acb5dac5d53457cbd278d927,2012-07-17 12:22:56.170784
 
287,52,prefer,38,code-review-test,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-07-17 12:25:01.172222
 
288,2,admin,34,a,"",push_local:445b722bf31d,2012-07-17 16:49:47.04337
 
289,3,demo,66,pm-test,"",started_following_repo,2012-07-17 17:04:59.403792
 
290,3,demo,8,Test_Repo,"",user_forked_repo:pm-test,2012-07-17 17:04:59.421648
 
291,3,demo,66,pm-test,"",user_created_fork:pm-test,2012-07-17 17:04:59.432594
 
292,3,demo,66,pm-test,"",push_local:6cac4edb9e76,2012-07-17 17:06:10.733221
 
293,3,demo,66,pm-test,"",push_local:ceabeecd9ee8,2012-07-17 17:08:49.922859
 
294,3,demo,67,group/aaa-repo,"",started_following_repo,2012-07-17 17:22:47.868349
 
295,3,demo,67,group/aaa-repo,"",user_created_repo,2012-07-17 17:22:47.883704
 
296,3,demo,68,aaa-project,"",started_following_repo,2012-07-17 17:23:40.541656
 
297,3,demo,68,aaa-project,"",user_created_repo,2012-07-17 17:23:40.552371
 
298,54,dude,69,group/bootstrap-fork,"",started_following_repo,2012-07-17 18:43:10.035674
 
299,54,dude,36,bootstrap,"",user_forked_repo:group/bootstrap-fork,2012-07-17 18:43:11.233142
 
300,54,dude,69,group/bootstrap-fork,"",user_created_fork:group/bootstrap-fork,2012-07-17 18:43:11.241307
 
301,54,dude,69,group/bootstrap-fork,"",user_commented_revision:550e375af08a5b6ad401c043f8c0d2f3b1d3b6c2,2012-07-17 18:46:04.298716
 
302,54,dude,70,group/A-new-git-repo,"",started_following_repo,2012-07-17 18:47:57.52576
 
303,54,dude,70,group/A-new-git-repo,"",user_created_repo,2012-07-17 18:47:57.537413
 
304,2,admin,71,rkquery-fork,"",started_following_repo,2012-07-18 15:54:45.756295
 
305,2,admin,71,rkquery-fork,"",admin_created_repo,2012-07-18 15:54:45.774453
 
306,61,test2,36,bootstrap,"",user_commented_revision:cd2d82150cc27c1f81d2394a22efbf2dbec0e7be,2012-07-20 06:02:57.703606
 
307,52,prefer,36,bootstrap,"",user_commented_revision:cd2d82150cc27c1f81d2394a22efbf2dbec0e7be,2012-07-20 08:38:49.709445
 
308,52,prefer,36,bootstrap,"",user_commented_revision:cd2d82150cc27c1f81d2394a22efbf2dbec0e7be,2012-07-20 08:50:24.082494
 
309,64,selecta,72,testgit,"",started_following_repo,2012-07-20 10:46:02.535088
 
310,64,selecta,72,testgit,"",user_created_repo,2012-07-20 10:46:02.548252
 
311,64,selecta,72,testgit,"",push_local:62a88b300d22,2012-07-20 10:46:16.81029
 
312,63,derTester,73,derTester-testrepo,"",started_following_repo,2012-07-20 10:54:39.064697
 
313,63,derTester,73,derTester-testrepo,"",user_created_repo,2012-07-20 10:54:39.079807
 
314,63,derTester,73,derTester-testrepo,"unknown, 194.8.219.19",push:84b31af757fe28ea9b9ac66053509a3a52b24f5c,2012-07-20 10:57:31.114727
 
315,63,derTester,73,derTester-testrepo,"",user_commented_revision:84b31af757fe28ea9b9ac66053509a3a52b24f5c,2012-07-20 11:07:50.716058
 
316,63,derTester,73,derTester-testrepo,"",user_commented_revision:84b31af757fe28ea9b9ac66053509a3a52b24f5c,2012-07-20 11:08:03.688221
 
317,63,derTester,73,derTester-testrepo,"",user_commented_revision:84b31af757fe28ea9b9ac66053509a3a52b24f5c,2012-07-20 11:08:16.565505
 
318,63,derTester,73,derTester-testrepo,"unknown, 194.8.219.19",push:5281b955815c98305051d3c008ff69c4ed533c0d,2012-07-20 11:11:10.31612
 
319,63,derTester,74,fork-derTester-testrepo,"",started_following_repo,2012-07-20 11:25:25.419964
 
320,63,derTester,73,derTester-testrepo,"",user_forked_repo:fork-derTester-testrepo,2012-07-20 11:25:25.438168
 
321,63,derTester,74,fork-derTester-testrepo,"",user_created_fork:fork-derTester-testrepo,2012-07-20 11:25:25.447682
 
322,63,derTester,74,fork-derTester-testrepo,"unknown, 194.8.219.19",pull,2012-07-20 11:26:37.491958
 
323,63,derTester,74,fork-derTester-testrepo,"unknown, 194.8.219.19",push:f2735aac6abe27c8f01e76faf5c283bf46c4401f,2012-07-20 11:27:44.331062
 
324,63,derTester,73,derTester-testrepo,"",user_commented_pull_request:9,2012-07-20 11:29:31.042888
 
325,63,derTester,73,derTester-testrepo,"",user_closed_pull_request:9,2012-07-20 11:29:31.049204
 
326,66,frankschepers,75,group/TestRepFs,"",started_following_repo,2012-07-20 11:30:19.886707
 
327,66,frankschepers,75,group/TestRepFs,"",user_created_repo,2012-07-20 11:30:19.898463
 
328,66,frankschepers,76,group/testrep2,"",started_following_repo,2012-07-20 11:31:20.300601
 
329,66,frankschepers,76,group/testrep2,"",user_created_repo,2012-07-20 11:31:20.311022
 
330,66,frankschepers,75,group/TestRepFs,"",push_local:17387d4e13a1,2012-07-20 11:33:31.893613
 
331,66,frankschepers,75,group/TestRepFs,"",push_local:a897a2d13bc2,2012-07-20 11:34:22.754229
 
332,63,derTester,73,derTester-testrepo,"unknown, 194.8.219.19",push:1214054a771a04bc69963bf26dfbc8ee2cb9122b,2012-07-20 11:36:39.441367
 
333,63,derTester,74,fork-derTester-testrepo,"unknown, 194.8.219.19",pull,2012-07-20 11:36:51.746969
 
334,63,derTester,73,derTester-testrepo,"unknown, 194.8.219.19","push:f2735aac6abe27c8f01e76faf5c283bf46c4401f,0659071d48979ed22941a269c97368b4663ae958",2012-07-20 11:37:40.944129
 
335,66,frankschepers,75,group/TestRepFs,137.120.73.17,pull,2012-07-20 11:39:49.54307
 
336,1,default,24,fork-Something,64.208.49.214,pull,2012-07-20 13:49:55.94902
 
337,1,default,24,fork-Something,64.208.49.218,pull,2012-07-20 13:54:22.988482
 
338,3,demo,68,aaa-project,"",user_updated_repo,2012-07-20 15:39:52.858365
 
339,63,derTester,73,derTester-testrepo,"",user_updated_repo,2012-07-20 16:27:14.407843
 
340,67,openinformation,73,derTester-testrepo,"",push_local:328fae54d511,2012-07-20 16:31:46.146409
 
341,67,openinformation,73,derTester-testrepo,"",push_local:0c569a05f314,2012-07-20 16:32:54.826366
 
342,63,derTester,73,derTester-testrepo,"",user_commented_revision:328fae54d511ba83c8e9ffe1cb9f42d30904a4a8,2012-07-20 16:33:01.509041
 
343,63,derTester,73,derTester-testrepo,"",user_commented_revision:328fae54d511ba83c8e9ffe1cb9f42d30904a4a8,2012-07-20 16:33:18.910418
 
344,67,openinformation,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:33:47.140002
 
345,63,derTester,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:35:08.640552
 
346,67,openinformation,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:35:10.546976
 
347,63,derTester,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:35:19.485402
 
348,63,derTester,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:35:47.956513
 
349,67,openinformation,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:36:19.043512
 
350,67,openinformation,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:36:48.577132
 
351,67,openinformation,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:38:16.822535
 
352,63,derTester,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-20 16:38:46.389457
 
353,3,demo,66,pm-test,"",user_commented_revision:1b6b9ca4d1e2776d8229f032c3a3136ae8c709a5,2012-07-20 18:48:42.618318
 
354,3,demo,71,rkquery-fork,"",user_commented_revision:06684d34a0dfeec4ca84eb3a4de3ac4eca659b5a,2012-07-20 18:53:30.111799
 
355,2,admin,66,pm-test,"",user_commented_revision:1b6b9ca4d1e2776d8229f032c3a3136ae8c709a5,2012-07-20 20:37:34.763255
 
356,2,admin,66,pm-test,"",user_commented_revision:1b6b9ca4d1e2776d8229f032c3a3136ae8c709a5,2012-07-20 20:37:54.48707
 
357,3,demo,77,group/testme-out,"",started_following_repo,2012-07-21 03:36:40.318489
 
358,3,demo,77,group/testme-out,"",user_created_repo,2012-07-21 03:36:40.33199
 
362,68,adam_cubiware,79,fork-testgit,"",started_following_repo,2012-07-21 12:42:44.576306
 
363,68,adam_cubiware,72,testgit,"",user_forked_repo:fork-testgit,2012-07-21 12:42:44.638332
 
364,68,adam_cubiware,79,fork-testgit,"",user_created_fork:fork-testgit,2012-07-21 12:42:44.652192
 
365,68,adam_cubiware,79,fork-testgit,"",push_local:ae0315d73341,2012-07-21 12:44:33.911138
 
366,68,adam_cubiware,79,fork-testgit,"",user_updated_repo,2012-07-21 12:47:12.163568
 
367,68,adam_cubiware,79,fork-testgit,"",push_local:db50409cdc5f,2012-07-21 12:53:44.632803
 
368,1,default,39,fork-code-review-test,91.143.250.55,pull,2012-07-21 23:48:23.449665
 
369,1,default,39,fork-code-review-test,91.143.250.55,pull,2012-07-21 23:48:36.982768
 
372,72,rushman,38,code-review-test,"",user_commented_pull_request:10,2012-07-22 23:44:39.072741
 
373,72,rushman,38,code-review-test,"",user_closed_pull_request:10,2012-07-22 23:44:39.082942
 
374,3,demo,34,a,"",user_updated_repo,2012-07-23 05:19:06.777651
 
375,2,admin,34,a,"",push_local:5478c7d290bc0a14d9cefd79ed5722a87f3815d5,2012-07-23 14:57:35.353962
 
376,2,admin,34,a,"",push_local:7ec6b566916b553f8ab92aaf1c993269b96b52ee,2012-07-23 14:57:47.489325
 
377,2,admin,34,a,"",push_local:7672806f881f67eb1441d00b16e983e761127cb6,2012-07-23 14:58:18.73749
 
378,2,admin,34,a,"",push_local:7f8b4f94e2a83394aa687e0bb110870769e9ca0a,2012-07-23 14:58:29.908109
 
379,75,treshnikov,44,diff-test,"",user_commented_revision:50daf150549b8d48676889dcb713f1f4e0e4bc9d,2012-07-23 16:43:41.7336
 
380,75,treshnikov,44,diff-test,"",user_commented_revision:50daf150549b8d48676889dcb713f1f4e0e4bc9d,2012-07-23 16:43:55.306834
 
381,3,demo,81,FS_dummy,"",started_following_repo,2012-07-24 11:59:32.839397
 
382,3,demo,81,FS_dummy,"",user_created_repo,2012-07-24 11:59:32.855419
 
383,67,openinformation,73,derTester-testrepo,"",user_commented_revision:0c569a05f31488c3a0b0bef9540e774199d5761b,2012-07-24 13:14:36.794825
 
384,67,openinformation,82,fork-derTester-testrepo2,"",started_following_repo,2012-07-24 13:21:01.528796
 
385,67,openinformation,73,derTester-testrepo,"",user_forked_repo:fork-derTester-testrepo2,2012-07-24 13:21:01.555045
 
386,67,openinformation,82,fork-derTester-testrepo2,"",user_created_fork:fork-derTester-testrepo2,2012-07-24 13:21:01.563889
 
387,77,test,34,a,"",user_commented_revision:5478c7d290bc0a14d9cefd79ed5722a87f3815d5,2012-07-24 15:38:45.147594
 
388,77,test,34,a,"",user_commented_revision:5478c7d290bc0a14d9cefd79ed5722a87f3815d5,2012-07-24 15:40:33.021633
 
389,77,test,34,a,"",user_commented_revision:5478c7d290bc0a14d9cefd79ed5722a87f3815d5,2012-07-24 15:40:53.491125
 
390,3,demo,83,group/roman-test,"",started_following_repo,2012-07-24 16:09:25.411937
 
391,3,demo,83,group/roman-test,"",user_created_repo,2012-07-24 16:09:25.426938
 
392,68,adam_cubiware,79,fork-testgit,"",push_local:d5c6ffefdf5499201c2679717d65d5a642f1e163,2012-07-24 19:33:06.111179
 
393,68,adam_cubiware,79,fork-testgit,"",user_commented_revision:d5c6ffefdf5499201c2679717d65d5a642f1e163,2012-07-24 19:33:44.899645
 
394,68,adam_cubiware,79,fork-testgit,"",user_updated_repo,2012-07-24 19:35:04.803706
 
395,68,adam_cubiware,79,group/fork-testgit,"",user_updated_repo,2012-07-24 19:37:19.243784
 
396,68,adam_cubiware,84,group/fork-Test_Repo,"",started_following_repo,2012-07-24 19:40:08.15438
 
397,68,adam_cubiware,8,Test_Repo,"",user_forked_repo:group/fork-Test_Repo,2012-07-24 19:40:08.173841
 
398,68,adam_cubiware,84,group/fork-Test_Repo,"",user_created_fork:group/fork-Test_Repo,2012-07-24 19:40:08.182255
 
399,68,adam_cubiware,84,group/fork-Test_Repo,"",user_commented_revision:1b6b9ca4d1e2776d8229f032c3a3136ae8c709a5,2012-07-24 19:41:34.833349
 
400,68,adam_cubiware,84,group/fork-Test_Repo,"",push_local:27213189ef4e7e8b47209d4e123042419cb1154a,2012-07-24 19:44:35.829394
 
401,68,adam_cubiware,8,Test_Repo,"",user_commented_pull_request:11,2012-07-24 19:47:49.707363
 
402,68,adam_cubiware,8,Test_Repo,"",user_commented_pull_request:11,2012-07-24 19:48:18.79552
 
403,68,adam_cubiware,8,Test_Repo,"",user_closed_pull_request:11,2012-07-24 19:48:18.804561
 
404,68,adam_cubiware,8,Test_Repo,"",user_commented_pull_request:12,2012-07-24 19:50:08.792408
 
405,68,adam_cubiware,8,Test_Repo,"",user_commented_pull_request:12,2012-07-24 19:50:21.615437
 
406,68,adam_cubiware,85,group/qbtest,"",started_following_repo,2012-07-24 19:54:48.682241
 
407,68,adam_cubiware,85,group/qbtest,"",user_created_repo,2012-07-24 19:54:48.693521
 
408,68,adam_cubiware,86,qbtest,"",started_following_repo,2012-07-24 19:56:30.027296
 
409,68,adam_cubiware,86,qbtest,"",user_created_repo,2012-07-24 19:56:30.040939
 
410,68,adam_cubiware,86,qbtest,"",push_local:04acb5b4d5e0baeedde09ab9f4921ebfd8a44fe3,2012-07-24 19:57:03.960782
 
411,68,adam_cubiware,87,fork-qbtest,"",started_following_repo,2012-07-24 19:57:49.226459
 
370,3,demo,,group/aaaaaa1,"",started_following_repo,2012-07-22 03:57:39.381977
 
371,3,demo,,group/aaaaaa1,"",user_created_repo,2012-07-22 03:57:39.394127
 
412,68,adam_cubiware,86,qbtest,"",user_forked_repo:fork-qbtest,2012-07-24 19:57:49.242082
 
413,68,adam_cubiware,87,fork-qbtest,"",user_created_fork:fork-qbtest,2012-07-24 19:57:49.249296
 
417,68,adam_cubiware,87,fork-qbtest,"",user_updated_repo,2012-07-24 20:01:54.283384
 
419,68,adam_cubiware,86,qbtest,"",user_commented_pull_request:13,2012-07-24 20:06:34.189996
 
414,68,adam_cubiware,87,fork-qbtest,"",push_local:8e189d16864ee66863e6153fd32b8ba3f2a25057,2012-07-24 19:58:20.712898
 
415,68,adam_cubiware,86,qbtest,"",user_commented_pull_request:13,2012-07-24 19:59:22.241511
 
418,68,adam_cubiware,86,qbtest,"",user_updated_repo,2012-07-24 20:02:57.048453
 
421,3,demo,87,fork-qbtest,"",user_commented_revision:8e189d16864ee66863e6153fd32b8ba3f2a25057,2012-07-24 20:11:04.301032
 
416,68,adam_cubiware,87,fork-qbtest,"",user_updated_repo,2012-07-24 20:01:41.416418
 
420,68,adam_cubiware,87,fork-qbtest,"",user_commented_revision:8e189d16864ee66863e6153fd32b8ba3f2a25057,2012-07-24 20:07:59.979705
 
422,3,demo,86,qbtest,"",user_commented_pull_request:13,2012-07-25 10:20:05.329183
 
423,3,demo,86,qbtest,"",user_commented_pull_request:13,2012-07-25 10:21:11.393746
 
424,3,demo,87,fork-qbtest,"",push_local:5556ddcc6f459ceaf3a5a305c56d3addd2ac7fb2,2012-07-25 10:22:50.053374
 
425,3,demo,87,fork-qbtest,"",user_commented_pull_request:14,2012-07-25 10:23:19.28703
 
426,3,demo,87,fork-qbtest,"",user_closed_pull_request:14,2012-07-25 10:23:19.294999
 
427,68,adam_cubiware,87,fork-qbtest,"",user_commented_revision:5556ddcc6f459ceaf3a5a305c56d3addd2ac7fb2,2012-07-25 10:26:23.952883
 
430,3,demo,86,qbtest,"",user_commented_pull_request:13,2012-07-25 10:28:09.672602
 
431,3,demo,86,qbtest,"",user_closed_pull_request:13,2012-07-25 10:28:09.683535
 
432,3,demo,86,qbtest,"",user_commented_pull_request:15,2012-07-25 15:04:21.750739
 
435,3,demo,86,qbtest,"",user_commented_pull_request:15,2012-07-25 15:05:29.409739
 
437,2,admin,87,fork-qbtest,"",user_commented_revision:8e189d16864ee66863e6153fd32b8ba3f2a25057,2012-07-25 15:06:24.177921
 
439,3,demo,86,qbtest,"",user_commented_pull_request:15,2012-07-25 15:06:58.589656
 
440,3,demo,34,a,"",user_updated_repo,2012-07-25 15:16:08.628588
 
441,3,demo,34,a,"",user_updated_repo,2012-07-25 15:16:50.160888
 
442,3,demo,34,a,"",user_updated_repo,2012-07-25 15:17:06.323596
 
443,3,demo,88,group/project-z,"",started_following_repo,2012-07-25 15:51:18.772615
 
444,3,demo,88,group/project-z,"",user_created_repo,2012-07-25 15:51:18.782868
 
445,3,demo,34,a,"",stopped_following_repo,2012-07-25 16:50:40.354634
 
446,3,demo,,Teszomg,"",started_following_repo,2012-07-25 16:58:00.642525
 
447,3,demo,,Teszomg,"",user_created_repo,2012-07-25 16:58:00.653681
 
448,3,demo,,Teszomg,"",user_deleted_repo,2012-07-25 17:00:13.827353
 
449,3,demo,90,a-fork1,"",started_following_repo,2012-07-25 17:52:15.778227
 
450,3,demo,34,a,"",user_forked_repo:a-fork1,2012-07-25 17:52:15.799024
 
451,3,demo,90,a-fork1,"",user_created_fork:a-fork1,2012-07-25 17:52:15.811638
 
452,3,demo,17,fork-test1,"",user_updated_repo,2012-07-25 18:30:05.412282
 
453,3,demo,91,SuperSolver,"",started_following_repo,2012-07-26 17:05:45.224827
 
454,3,demo,91,SuperSolver,"",user_created_repo,2012-07-26 17:05:45.238431
 
455,3,demo,91,SuperSolver,98.175.25.130,push:9191f84aab39f525a510865e8bfabdda11dd72a5,2012-07-26 17:09:12.133493
 
456,3,demo,92,group/kanad,"",started_following_repo,2012-07-26 21:11:56.38604
 
457,3,demo,92,group/kanad,"",user_created_repo,2012-07-26 21:11:56.400791
 
458,3,demo,92,group/kanad,"",user_updated_repo,2012-07-26 21:19:27.63466
 
459,2,admin,91,SuperSolver,"",push_local:466e4c17d8eda2789c5c885eeb376592f612c305,2012-07-26 22:17:43.023259
 
460,2,admin,91,SuperSolver,"",user_commented_revision:9191f84aab39f525a510865e8bfabdda11dd72a5,2012-07-26 22:18:16.224826
 
461,81,ahamilton,34,a,"",user_commented_revision:7f8b4f94e2a83394aa687e0bb110870769e9ca0a,2012-07-26 22:57:40.178759
 
462,1,default,34,a,54.247.183.89,pull,2012-07-26 23:14:42.710865
 
463,2,admin,34,a,"",admin_updated_repo,2012-07-27 01:33:24.257365
 
464,2,admin,56,brgit,"",admin_updated_repo,2012-07-27 01:33:54.214629
 
465,2,admin,93,fork-a,"",started_following_repo,2012-07-27 18:07:48.00309
 
466,2,admin,34,a,"",user_forked_repo:fork-a,2012-07-27 18:07:48.022053
 
467,2,admin,93,fork-a,"",user_created_fork:fork-a,2012-07-27 18:07:48.032889
 
468,2,admin,68,aaa-project,"",admin_updated_repo,2012-07-28 16:16:49.199267
 
469,2,admin,68,aaa-project,"",admin_updated_repo,2012-07-28 16:17:05.556031
 
470,2,admin,68,aaa-project,"",admin_updated_repo,2012-07-28 16:17:24.114857
 
471,2,admin,68,aaa-project,"",admin_updated_repo,2012-07-28 16:17:59.530129
 
472,2,admin,68,aaa-project,"",admin_updated_repo,2012-07-28 16:26:13.302324
 
473,2,admin,68,aaa-project,"",admin_updated_repo,2012-07-28 16:27:01.350536
 
474,86,gurce,,testies1.2.3,"",started_following_repo,2012-07-29 11:08:56.897379
 
475,86,gurce,,testies1.2.3,"",user_created_repo,2012-07-29 11:08:56.912364
 
476,86,gurce,,testies1.2.3,"",user_updated_repo,2012-07-29 11:14:02.439893
 
477,86,gurce,,testies1.2.3,"",user_deleted_repo,2012-07-29 11:18:46.488699
 
480,2,admin,,group/Linux,"",started_following_repo,2012-07-30 14:44:34.637639
 
481,2,admin,,group/Linux,"",admin_deleted_repo,2012-07-30 14:52:58.379429
 
482,3,demo,98,group/Another-Test-Repository,"",started_following_repo,2012-07-31 10:18:43.621644
 
483,3,demo,98,group/Another-Test-Repository,"",user_created_repo,2012-07-31 10:18:43.634721
 
484,3,demo,98,group/Another-Test-Repository,"",push_local:751faf9101afc1d11ce4c2a169991a17edbb7955,2012-07-31 10:19:46.035458
 
485,3,demo,98,group/Another-Test-Repository,"",user_updated_repo,2012-07-31 10:20:54.422059
 
486,3,demo,98,group/Another-Test-Repository,"",user_updated_repo,2012-07-31 10:21:47.573228
 
487,3,demo,98,group/Another-Test-Repository,"",stopped_following_repo,2012-07-31 10:22:43.12098
 
488,3,demo,98,group/Another-Test-Repository,"",started_following_repo,2012-07-31 10:22:48.801682
 
489,90,klaim,99,another-fork-to-check-code-review,"",started_following_repo,2012-07-31 14:25:57.394187
 
490,90,klaim,38,code-review-test,"",user_forked_repo:another-fork-to-check-code-review,2012-07-31 14:25:58.882735
 
491,90,klaim,99,another-fork-to-check-code-review,"",user_created_fork:another-fork-to-check-code-review,2012-07-31 14:25:58.889998
 
492,90,klaim,99,another-fork-to-check-code-review,"",user_commented_revision:c29efd2723954ba34fb63f9c7dce21a68b09715c,2012-07-31 14:27:39.427879
 
493,1,default,71,rkquery-fork,89.0.87.249,pull,2012-07-31 15:08:08.127006
 
494,1,default,71,rkquery-fork,89.0.87.249,pull,2012-07-31 15:08:37.692433
 
495,1,default,71,rkquery-fork,89.0.87.249,pull,2012-07-31 15:08:40.983571
 
496,3,demo,100,wurst,"",started_following_repo,2012-07-31 15:14:37.401815
 
497,3,demo,100,wurst,"",user_created_repo,2012-07-31 15:14:37.412923
 
498,1,default,100,wurst,89.0.87.249,pull,2012-07-31 15:14:45.754467
 
499,91,mzambrano,101,Prueba,"",started_following_repo,2012-07-31 17:04:41.872432
 
500,91,mzambrano,101,Prueba,"",user_created_repo,2012-07-31 17:04:41.883651
 
501,91,mzambrano,101,Prueba,"",push_local:9ecaa313dfd69d04eb99a6ab4650d5073d0979e0,2012-07-31 17:05:04.373838
 
506,3,demo,90,a-fork1,"",push_local:b09d43f798414bcbdf4dc1fc5dafe6ce4aa5afc3,2012-08-01 03:18:34.613972
 
507,3,demo,90,a-fork1,"",user_updated_repo,2012-08-01 03:19:21.260608
 
508,3,demo,34,a,"",user_commented_pull_request:16,2012-08-01 03:20:55.082899
 
509,3,demo,34,a,"",user_closed_pull_request:16,2012-08-01 03:20:55.089597
 
510,3,demo,34,a,"",user_commented_pull_request:17,2012-08-01 03:24:44.63976
 
511,3,demo,41,fork-code-review-test1111111,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-08-01 18:56:56.755186
 
512,3,demo,41,fork-code-review-test1111111,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-08-01 18:57:03.502595
 
478,86,gurce,,aaa,"",started_following_repo,2012-07-29 11:19:09.137514
 
479,86,gurce,,aaa,"",user_created_repo,2012-07-29 11:19:09.151528
 
513,15,Vipous,25,My1,"",push_local:50e642196270635f02c5bd5c00e499dc187178df,2012-08-01 19:11:17.87993
 
514,1,default,25,My1,95.24.51.243,pull,2012-08-01 19:15:28.508852
 
515,15,Vipous,25,my1,"",user_updated_repo,2012-08-01 19:32:20.993611
 
516,15,Vipous,103,my2,"",started_following_repo,2012-08-01 19:38:38.060511
 
517,15,Vipous,103,my2,"",user_created_repo,2012-08-01 19:38:38.069864
 
518,15,Vipous,103,my2,"",user_updated_repo,2012-08-01 19:45:16.160287
 
519,15,Vipous,103,my2,"",user_updated_repo,2012-08-01 19:46:04.886008
 
520,15,Vipous,104,m3,"",started_following_repo,2012-08-01 19:46:48.535281
 
521,15,Vipous,104,m3,"",user_created_repo,2012-08-01 19:46:48.549938
 
522,15,Vipous,104,m3,"",user_updated_repo,2012-08-01 19:47:15.299734
 
523,95,vladest,105,group/MainCa,"",started_following_repo,2012-08-02 11:30:01.303239
 
524,95,vladest,105,group/MainCa,"",user_created_repo,2012-08-02 11:30:01.314496
 
525,95,vladest,105,group/MainCa,"",push_local:d43c6b4b865d2c37ac9bb8300ed2594f5c7bfac1,2012-08-02 11:32:35.723828
 
526,95,vladest,106,group/MainCa1,"",started_following_repo,2012-08-02 12:20:15.170113
 
527,95,vladest,106,group/MainCa1,"",user_created_repo,2012-08-02 12:20:15.178842
 
528,97,Cykooz,107,TestRep,"",started_following_repo,2012-08-02 14:19:22.221295
 
529,97,Cykooz,107,TestRep,"",user_created_repo,2012-08-02 14:19:22.233832
 
530,97,Cykooz,107,TestRep,"",push_local:d15f2b728cbe3d99cdb87847252245defb65af97,2012-08-02 14:20:54.178448
 
532,3,demo,1,test,"",user_commented_revision:ef02269209cd431c0cd0ee929ba37ae895651d69,2012-08-03 10:06:58.707278
 
533,3,demo,108,pouet_toto,"",started_following_repo,2012-08-03 10:39:59.081678
 
534,3,demo,108,pouet_toto,"",user_created_repo,2012-08-03 10:39:59.093405
 
535,1,default,107,TestRep,195.238.92.121,pull,2012-08-03 17:59:06.989454
 
538,3,demo,110,django,"",started_following_repo,2012-08-03 19:18:45.155897
 
539,3,demo,110,django,"",user_created_repo,2012-08-03 19:18:45.172636
 
540,3,demo,90,a-fork1,"",user_commented_revision:b09d43f798414bcbdf4dc1fc5dafe6ce4aa5afc3,2012-08-03 19:33:48.041371
 
541,102,floris1988,111,TestSpecialChars-ï,"",started_following_repo,2012-08-04 18:53:17.2228
 
542,102,floris1988,111,TestSpecialChars-ï,"",user_created_repo,2012-08-04 18:53:17.234721
 
543,102,floris1988,111,TestSpecialChars-ï,"",user_updated_repo,2012-08-04 18:53:50.060979
 
544,102,floris1988,111,TestSpecialChars-ï,"",user_updated_repo,2012-08-04 18:55:53.495862
 
545,3,demo,112,segaja_test,"",started_following_repo,2012-08-04 19:04:06.239802
 
546,3,demo,112,segaja_test,"",user_created_repo,2012-08-04 19:04:06.253287
 
547,3,demo,112,segaja_test,92.224.13.159,push:42e459600bdbd38d1faf6eaa10c7e01c56cd10f9,2012-08-04 19:29:14.690831
 
548,1,default,112,segaja_test,92.224.252.14,pull,2012-08-04 19:34:36.973664
 
549,3,demo,113,fork-big-project-test,"",started_following_repo,2012-08-05 02:55:27.385395
 
550,3,demo,32,big-project,"",user_forked_repo:fork-big-project-test,2012-08-05 02:55:27.414409
 
551,3,demo,113,fork-big-project-test,"",user_created_fork:fork-big-project-test,2012-08-05 02:55:27.4288
 
552,2,admin,,zaraza,"",admin_deleted_repo,2012-08-05 13:27:42.970283
 
553,2,admin,,asd,"",admin_deleted_repo,2012-08-05 13:28:00.428749
 
536,3,demo,,short,"",started_following_repo,2012-08-03 18:03:15.665115
 
537,3,demo,,short,"",user_created_repo,2012-08-03 18:03:15.67758
 
554,2,admin,,short,"",admin_deleted_repo,2012-08-05 13:28:31.888167
 
555,2,admin,,rune-test,"",admin_deleted_repo,2012-08-05 13:28:37.66319
 
556,2,admin,,test2,"",admin_deleted_repo,2012-08-05 13:29:14.388401
 
502,3,demo,,test1771,"",started_following_repo,2012-07-31 23:21:17.003832
 
503,3,demo,,test1771,"",user_created_repo,2012-07-31 23:21:17.01404
 
504,3,demo,,test1771,"",user_updated_repo,2012-07-31 23:22:03.144832
 
505,3,demo,,test1771,"",user_updated_repo,2012-07-31 23:22:24.167363
 
557,2,admin,,test1771,"",admin_deleted_repo,2012-08-05 13:29:38.632652
 
558,2,admin,,aaa,"",admin_deleted_repo,2012-08-05 13:30:03.546834
 
359,3,demo,,group/aaaaa,"",started_following_repo,2012-07-21 03:38:35.138131
 
360,3,demo,,group/aaaaa,"",user_created_repo,2012-07-21 03:38:35.15336
 
361,3,demo,,group/aaaaa,"",stopped_following_repo,2012-07-21 03:40:17.083354
 
559,2,admin,,group/aaaaa,"",admin_deleted_repo,2012-08-05 13:30:13.234414
 
560,2,admin,,group/aaaaaa1,"",admin_deleted_repo,2012-08-05 13:30:18.727572
 
561,3,demo,114,repo1,"",started_following_repo,2012-08-05 22:24:30.710387
 
562,3,demo,114,repo1,"",user_created_repo,2012-08-05 22:24:30.720533
 
563,3,demo,114,repo1,"",user_updated_repo,2012-08-05 22:25:03.129876
 
564,3,demo,114,group/repo1,"",user_updated_repo,2012-08-06 01:33:29.413213
 
565,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-08-06 12:41:54.182248
 
566,3,demo,115,seva,"",started_following_repo,2012-08-06 13:50:43.115804
 
567,3,demo,115,seva,"",user_created_repo,2012-08-06 13:50:43.129954
 
568,3,demo,115,seva,94.28.52.54,push:06a5a7a52876f01f458a2f816320bab5bafc8cb7,2012-08-06 14:05:42.593075
 
569,3,demo,116,sr_Types,"",started_following_repo,2012-08-06 14:10:07.910072
 
570,3,demo,116,sr_Types,"",user_created_repo,2012-08-06 14:10:07.917777
 
571,3,demo,116,sr_Types,94.28.52.54,"push:82f049910f50a5f21af4e097ff143cffc40ed24b,744a1af870e28684381d6dbc49fc3ee8e84bd037,c4e4c1f60bf9c35ddb6b3b244e3ac653bf9013fb,6243a66ba6f45ae7019b785e34c87415c75f0100,f98dabdf9d6721c9cb2ce951473602261b197572",2012-08-06 14:11:06.205283
 
572,3,demo,117,group/PersTest,"",started_following_repo,2012-08-07 13:56:12.405578
 
573,3,demo,117,group/PersTest,"",user_created_repo,2012-08-07 13:56:12.425432
 
574,3,demo,118,group/fork-PersTest11111,"",started_following_repo,2012-08-07 16:19:34.151798
 
575,3,demo,117,group/PersTest,"",user_forked_repo:group/fork-PersTest11111,2012-08-07 16:19:35.508635
 
576,3,demo,118,group/fork-PersTest11111,"",user_created_fork:group/fork-PersTest11111,2012-08-07 16:19:35.521466
 
577,3,demo,119,group/fork-PersTesttest23,"",started_following_repo,2012-08-07 16:21:38.613229
 
578,3,demo,117,group/PersTest,"",user_forked_repo:group/fork-PersTesttest23,2012-08-07 16:21:39.912103
 
579,3,demo,119,group/fork-PersTesttest23,"",user_created_fork:group/fork-PersTesttest23,2012-08-07 16:21:39.925959
 
580,3,demo,120,group/clojure.git,"",started_following_repo,2012-08-07 16:23:44.191686
 
581,3,demo,120,group/clojure.git,"",user_created_repo,2012-08-07 16:23:44.209175
 
582,3,demo,121,group/fork-clojure.git11111,"",started_following_repo,2012-08-07 16:23:59.92049
 
583,3,demo,120,group/clojure.git,"",user_forked_repo:group/fork-clojure.git11111,2012-08-07 16:24:01.272504
 
584,3,demo,121,group/fork-clojure.git11111,"",user_created_fork:group/fork-clojure.git11111,2012-08-07 16:24:01.286295
 
585,3,demo,121,group/fork-clojure.git11111,"",user_updated_repo,2012-08-07 16:25:08.111886
 
586,3,demo,117,group/PersTest,"",user_commented_revision:3823d29c041a56af5d798e1bf308169635b307b2,2012-08-07 16:33:30.109982
 
587,3,demo,117,group/PersTest,"",user_commented_revision:3823d29c041a56af5d798e1bf308169635b307b2,2012-08-07 16:33:47.039431
 
588,3,demo,117,group/PersTest,"",push_local:cc8900b3722b55c4435ccf5c14cf4883c62ebdb1,2012-08-07 16:34:33.016369
 
589,1,default,34,a,75.69.241.64,pull,2012-08-07 16:45:32.904556
 
590,3,demo,122,amab,"",started_following_repo,2012-08-08 18:51:41.487459
 
591,3,demo,122,amab,"",user_created_repo,2012-08-08 18:51:41.502954
 
592,3,demo,123,fork-amab,"",started_following_repo,2012-08-08 18:52:54.7185
 
593,3,demo,122,amab,"",user_forked_repo:fork-amab,2012-08-08 18:52:54.735201
 
594,3,demo,123,fork-amab,"",user_created_fork:fork-amab,2012-08-08 18:52:54.747165
 
595,108,dukeofgaming,124,fork-another-fork-to-check-code-review,"",started_following_repo,2012-08-08 20:20:04.849671
 
596,108,dukeofgaming,99,another-fork-to-check-code-review,"",user_forked_repo:fork-another-fork-to-check-code-review,2012-08-08 20:20:04.90856
 
597,108,dukeofgaming,124,fork-another-fork-to-check-code-review,"",user_created_fork:fork-another-fork-to-check-code-review,2012-08-08 20:20:04.916268
 
598,108,dukeofgaming,125,test-to-end-all-tests,"",started_following_repo,2012-08-08 20:24:44.691886
 
599,108,dukeofgaming,125,test-to-end-all-tests,"",user_created_repo,2012-08-08 20:24:44.701816
 
600,108,dukeofgaming,125,test-to-end-all-tests,"",push_local:fb4eb182028a674ae250430c04305e9b3fbe508e,2012-08-08 20:26:27.345121
 
601,108,dukeofgaming,34,a,"",user_commented_pull_request:17,2012-08-08 21:57:59.006296
 
602,109,StrangeWill,126,StrangeWill-Test,"",started_following_repo,2012-08-09 02:34:52.271872
 
603,109,StrangeWill,126,StrangeWill-Test,"",user_created_repo,2012-08-09 02:34:52.282934
 
604,109,StrangeWill,126,StrangeWill-Test,"",user_updated_repo,2012-08-09 02:35:02.383584
 
605,109,StrangeWill,126,StrangeWill-Test,"",user_updated_repo,2012-08-09 02:35:06.402314
 
606,109,StrangeWill,126,StrangeWill-Test,"",push_local:9c53f740e08b8bbc51bb3c44b1daab9f52287d3a,2012-08-09 02:35:43.942575
 
607,109,StrangeWill,126,StrangeWill-Test,"",user_commented_pull_request:19,2012-08-09 02:36:48.962911
 
608,109,StrangeWill,126,StrangeWill-Test,"",user_closed_pull_request:19,2012-08-09 02:36:48.968935
 
609,3,demo,1,test,"",user_commented_pull_request:20,2012-08-10 11:23:48.112425
 
610,3,demo,1,test,"",user_closed_pull_request:20,2012-08-10 11:23:48.122186
 
611,3,demo,8,Test_Repo,"",user_commented_pull_request:12,2012-08-10 11:29:38.483128
 
612,3,demo,8,Test_Repo,"",user_commented_pull_request:12,2012-08-10 11:29:48.326018
 
613,3,demo,8,Test_Repo,"",user_closed_pull_request:12,2012-08-10 11:29:48.336563
 
614,3,demo,34,a,"",user_commented_pull_request:18,2012-08-10 11:32:01.569982
 
615,2,admin,,"","",admin_created_users_group:group,2012-08-10 20:13:05.655137
 
616,3,demo,122,amab,"",push_local:86b1fc3a3f5dc193814327817d2274dc2e25aa74,2012-08-11 05:48:36.958893
 
617,3,demo,122,amab,"",user_commented_revision:86b1fc3a3f5dc193814327817d2274dc2e25aa74,2012-08-11 05:49:10.966918
 
618,3,demo,122,amab,"",push_local:8530d8e3eab04997ac4a2a5d8a8b54fa61bb9884,2012-08-11 05:50:15.022811
 
619,3,demo,127,my-super-rep,"",started_following_repo,2012-08-11 12:30:55.461553
 
620,3,demo,127,my-super-rep,"",user_created_repo,2012-08-11 12:30:55.490584
 
621,3,demo,127,my-super-rep,"",push_local:5d80e28538141e322b317168e2367fb03178d58c,2012-08-11 12:32:07.883859
 
622,3,demo,127,my-super-rep,"",user_updated_repo,2012-08-11 12:33:26.213226
 
623,3,demo,124,fork-another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-08-11 15:07:59.546001
 
624,3,demo,29,otro-test,"",push_local:84da67001150cd0bf3ef744c286bcc432ea21bd4,2012-08-11 15:33:05.169706
 
625,1,default,81,FS_dummy,66.85.224.48,pull,2012-08-11 19:31:31.664606
 
626,3,demo,128,testprivate,"",started_following_repo,2012-08-12 10:25:42.265395
 
627,3,demo,128,testprivate,"",user_created_repo,2012-08-12 10:25:42.278839
 
628,3,demo,128,testprivate,"",user_updated_repo,2012-08-12 10:27:29.467173
 
629,3,demo,128,testprivate,"",user_updated_repo,2012-08-12 10:28:09.878656
 
630,3,demo,128,group/testprivate,"",user_updated_repo,2012-08-12 10:29:00.702759
 
631,3,demo,128,group/testprivate,"",push_local:a7e9cdbd374255258a2d470dae64142c62577e62,2012-08-12 10:32:28.350191
 
632,3,demo,54,glib,"",user_commented_revision:eda1735029e01d6391fe8a4cde6c5688727c8183,2012-08-12 15:21:32.004992
 
633,3,demo,54,glib,"",user_commented_revision:eda1735029e01d6391fe8a4cde6c5688727c8183,2012-08-12 15:21:56.235395
 
634,3,demo,129,dvorak,"",started_following_repo,2012-08-12 15:23:37.292086
 
635,3,demo,129,dvorak,"",user_created_repo,2012-08-12 15:23:37.302785
 
636,3,demo,129,dvorak,202.147.201.173,pull,2012-08-12 15:24:08.62022
 
637,3,demo,130,x,"",started_following_repo,2012-08-12 23:37:03.115333
 
638,3,demo,130,x,"",user_created_repo,2012-08-12 23:37:03.130599
 
639,3,demo,124,fork-another-fork-to-check-code-review,"",user_commented_revision:8b7cd9a998f0f4ec47cf75b59b3d2c08167c3cf7,2012-08-12 23:39:33.305222
 
640,3,demo,44,diff-test,"",user_commented_revision:50daf150549b8d48676889dcb713f1f4e0e4bc9d,2012-08-13 05:24:22.678285
 
641,3,demo,123,fork-amab,"",push_local:6a6a5d929be9b4929041627d35f18627d9418aa5,2012-08-13 10:53:50.793419
 
642,1,default,57,SuperProject,128.237.226.40,pull,2012-08-13 16:07:22.373945
 
643,3,demo,34,a,"",user_commented_pull_request:24,2012-08-13 19:43:04.754874
 
644,3,demo,34,a,"",user_closed_pull_request:24,2012-08-13 19:43:04.765323
 
645,3,demo,34,a,"",user_commented_pull_request:25,2012-08-13 19:45:34.763703
 
646,3,demo,34,a,"",user_closed_pull_request:25,2012-08-13 19:45:34.769014
 
647,3,demo,131,group/test-v,"",started_following_repo,2012-08-13 19:46:36.628573
 
648,3,demo,131,group/test-v,"",user_created_repo,2012-08-13 19:46:36.637409
 
649,3,demo,131,group/test-v,"",push_local:5528f3d665c9c9577670ec1e47428ec12686309e,2012-08-13 19:46:57.911585
 
650,3,demo,132,test-alex,"",started_following_repo,2012-08-13 21:21:05.904895
 
651,3,demo,132,test-alex,"",user_created_repo,2012-08-13 21:21:05.916732
 
652,3,demo,132,test-alex,"",push_local:016bda6a3079ea1d69b6a309a9ecc61fe5b671df,2012-08-13 21:21:34.951309
 
653,3,demo,132,test-alex,"",user_commented_revision:016bda6a3079ea1d69b6a309a9ecc61fe5b671df,2012-08-13 21:22:06.758798
 
654,3,demo,132,test-alex,"",push_local:7f43f5167e26a3e43e6ad0ac6539ab4c8589a509,2012-08-13 21:22:18.07678
 
655,3,demo,132,test-alex,"",user_commented_revision:7f43f5167e26a3e43e6ad0ac6539ab4c8589a509,2012-08-13 21:22:39.209522
 
656,3,demo,132,test-alex,"",push_local:9b754ec30decff4c11c0f82522b7ec9dd732b738,2012-08-13 21:23:44.132906
 
657,3,demo,132,test-alex,"",user_commented_revision:9b754ec30decff4c11c0f82522b7ec9dd732b738,2012-08-13 21:24:34.975113
 
658,3,demo,132,test-alex,"",push_local:625c046f35779ccde8c2284ee60fda3d9598e8bb,2012-08-13 21:25:07.493234
 
659,3,demo,132,test-alex,"",push_local:807dd6bb60f5eef82f7ffdd988dee3e0de4e44dc,2012-08-13 21:26:51.764858
 
660,3,demo,132,test-alex,"",push_local:24224f94a8578508883f58982e10b0ffa83a98d6,2012-08-13 21:28:03.831471
 
661,3,demo,42,foo,"",user_commented_revision:ca953e8c5c1ada44e9a8f945a0a6999d2f44310d,2012-08-14 18:40:46.618059
 
662,118,peso-rhodecode,99,another-fork-to-check-code-review,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-08-14 18:58:56.536013
 
663,118,peso-rhodecode,99,another-fork-to-check-code-review,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-08-14 18:59:58.982696
 
664,118,peso-rhodecode,133,tortoisehg,"",started_following_repo,2012-08-14 19:05:14.873877
 
665,118,peso-rhodecode,133,tortoisehg,"",user_created_repo,2012-08-14 19:05:14.88921
 
666,119,ricardona,39,fork-code-review-test,"",user_commented_revision:ac19ef61aab0b008acb5dac5d53457cbd278d927,2012-08-14 21:20:28.585574
 
667,3,demo,134,TestIM,"",started_following_repo,2012-08-14 22:23:05.22279
 
668,3,demo,134,TestIM,"",user_created_repo,2012-08-14 22:23:05.235172
 
669,3,demo,134,TestIM,216.16.228.6,push:b3b6cfdb515f13709b13f82d20efd74daaa11d91,2012-08-14 22:23:54.286624
 
670,3,demo,134,TestIM,216.16.228.6,push:9fb9ba572906576b2cc53ac227d503317f019556,2012-08-14 22:24:48.190215
 
671,3,demo,134,TestIM,"",user_commented_pull_request:26,2012-08-14 22:25:32.752851
 
672,3,demo,134,TestIM,"",user_commented_pull_request:26,2012-08-14 22:26:29.238006
 
673,3,demo,134,TestIM,"",user_closed_pull_request:26,2012-08-14 22:26:29.246245
 
674,3,demo,134,TestIM,216.16.228.6,push:55a4fabac6221f988a276ec34343b947dfbc8a1f,2012-08-14 22:35:56.966751
 
676,120,asdfqwer,135,Asdf,"",started_following_repo,2012-08-15 01:25:41.462335
 
677,120,asdfqwer,135,Asdf,"",user_created_repo,2012-08-15 01:25:41.473404
 
678,120,asdfqwer,135,Asdf,"",push_local:e43db28406d1d0697f504af9bc2ae5c5b789bba3,2012-08-15 01:27:34.991
 
679,3,demo,68,aaa-project,"",push_local:2babd97db425482a53b679956df09f89c3154a2c,2012-08-15 03:43:31.538895
 
680,3,demo,134,TestIM,"",user_commented_revision:55a4fabac6221f988a276ec34343b947dfbc8a1f,2012-08-15 14:30:08.564118
 
681,3,demo,134,TestIM,"",user_commented_pull_request:27,2012-08-15 14:30:18.831116
 
682,3,demo,134,TestIM,"",user_closed_pull_request:27,2012-08-15 14:30:18.840491
 
683,3,demo,134,TestIM,216.16.228.6,push:bb4219af072d59cc4c3c43c378ed51fa4cf3c3ff,2012-08-15 15:07:41.727749
 
684,1,default,131,group/test-v,24.226.1.232,pull,2012-08-15 16:55:41.900521
 
685,3,demo,131,group/test-v,"",user_commented_revision:5528f3d665c9c9577670ec1e47428ec12686309e,2012-08-15 17:03:55.63388
 
686,1,default,131,group/test-v,24.226.1.232,pull,2012-08-15 17:08:29.295025
 
687,1,default,131,group/test-v,24.226.1.232,pull,2012-08-15 17:29:40.060992
 
688,1,default,131,group/test-v,24.226.1.232,pull,2012-08-15 17:33:06.514696
 
689,1,default,131,group/test-v,24.226.1.232,pull,2012-08-15 17:35:45.952417
 
690,1,default,131,group/test-v,24.226.1.232,pull,2012-08-15 17:45:52.189501
 
691,1,default,131,group/test-v,24.226.1.232,pull,2012-08-15 18:15:01.771261
 
692,3,demo,136,demorep,"",started_following_repo,2012-08-15 20:15:43.960506
 
693,3,demo,136,demorep,"",user_created_repo,2012-08-15 20:15:43.97291
 
694,3,demo,136,demorep,"",user_updated_repo,2012-08-15 20:16:36.235636
 
695,116,japanfred,137,group/test,"",started_following_repo,2012-08-16 10:07:53.071203
 
696,116,japanfred,137,group/test,"",user_created_repo,2012-08-16 10:07:53.085238
 
697,3,demo,38,code-review-test,"",user_commented_revision:e780fb37168be5382148f5bc6fd420ae9771e947,2012-08-16 10:40:09.850092
 
698,3,demo,38,code-review-test,"",user_commented_revision:e780fb37168be5382148f5bc6fd420ae9771e947,2012-08-16 10:40:18.256489
 
699,3,demo,138,zzz,"",started_following_repo,2012-08-16 15:32:36.358347
 
700,3,demo,138,zzz,"",user_created_repo,2012-08-16 15:32:36.375112
 
701,3,demo,138,zzz,"",stopped_following_repo,2012-08-16 15:32:47.449322
 
702,3,demo,138,zzz,"",push_local:30c34a6a74a3acb1ac90da14cbf5afc195c06703,2012-08-16 15:35:02.210691
 
703,3,demo,139,groupv,"",started_following_repo,2012-08-16 21:18:09.813691
 
704,3,demo,139,groupv,"",user_created_repo,2012-08-16 21:18:09.828768
 
705,3,demo,140,tryit,"",started_following_repo,2012-08-16 21:38:23.244914
 
706,3,demo,140,tryit,"",user_created_repo,2012-08-16 21:38:23.255027
 
707,3,demo,24,fork-Something,"",push_local:3e4a3d2cb39cc292337813a1b66886612967a12f,2012-08-17 08:46:15.254412
 
708,125,thebodster,141,benltest,"",started_following_repo,2012-08-17 11:05:03.588299
 
709,125,thebodster,141,benltest,"",user_created_repo,2012-08-17 11:05:03.599788
 
710,125,thebodster,141,benltest,"",push_local:81058e0bbe3ff64719b622da3e3d4973a00aa17f,2012-08-17 11:06:28.089348
 
711,3,demo,142,asd,"",started_following_repo,2012-08-17 17:05:25.612621
 
712,3,demo,142,asd,"",user_created_repo,2012-08-17 17:05:25.623665
 
713,3,demo,90,a-fork1,"",user_commented_revision:5478c7d290bc0a14d9cefd79ed5722a87f3815d5,2012-08-20 11:55:54.518151
 
714,3,demo,90,a-fork1,"",user_commented_revision:5478c7d290bc0a14d9cefd79ed5722a87f3815d5,2012-08-20 11:56:13.790927
 
715,3,demo,34,a,"",user_commented_revision:7ec6b566916b553f8ab92aaf1c993269b96b52ee,2012-08-20 12:15:53.217431
 
716,3,demo,143,collabo-test,"",started_following_repo,2012-08-20 14:26:09.569571
 
717,3,demo,143,collabo-test,"",user_created_repo,2012-08-20 14:26:09.582085
 
718,3,demo,143,collabo-test,"",user_updated_repo,2012-08-20 14:32:35.45571
 
719,3,demo,143,group/collabo-test,"",user_updated_repo,2012-08-20 14:34:12.224005
 
720,3,demo,143,group/collabo-test,"",user_updated_repo,2012-08-20 14:38:00.881804
 
721,3,demo,143,group/collabo-test,"",user_updated_repo,2012-08-20 14:38:55.248397
 
722,131,edroi,144,group/testing_repo_ed,"",started_following_repo,2012-08-20 17:52:56.864724
 
723,131,edroi,144,group/testing_repo_ed,"",user_created_repo,2012-08-20 17:52:56.875807
 
724,3,demo,145,group/test001,"",started_following_repo,2012-08-21 12:04:31.34427
 
725,3,demo,145,group/test001,"",user_created_repo,2012-08-21 12:04:31.361085
 
726,3,demo,145,group/test001,"",push_local:be9945bab2129191dcfe7c3cf1530c953cb56250,2012-08-21 12:06:07.781578
 
727,2,admin,34,a,"",user_commented_revision:7f8b4f94e2a83394aa687e0bb110870769e9ca0a,2012-08-21 12:09:46.857288
 
728,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-08-22 10:25:41.344244
 
729,3,demo,146,group/sjhasgdasgd,"",started_following_repo,2012-08-22 10:27:23.865563
 
730,3,demo,146,group/sjhasgdasgd,"",user_created_repo,2012-08-22 10:27:23.879703
 
731,134,asdf1234,,master-work,"",started_following_repo,2012-08-22 15:42:30.690987
 
732,134,asdf1234,,master-work,"",user_created_repo,2012-08-22 15:42:30.701316
 
733,134,asdf1234,,master-work,"",push_local:9a0c3c1f07d0d53f4578048e64ee7460540a8650,2012-08-22 15:42:51.105132
 
734,134,asdf1234,,master-work,"",user_deleted_repo,2012-08-22 15:43:40.616875
 
740,3,demo,122,amab,"",user_commented_revision:8530d8e3eab04997ac4a2a5d8a8b54fa61bb9884,2012-08-22 15:55:10.054525
 
735,134,asdf1234,,Master-Repo,"",started_following_repo,2012-08-22 15:44:00.955916
 
736,134,asdf1234,,Master-Repo,"",user_created_repo,2012-08-22 15:44:00.969061
 
737,134,asdf1234,,Master-Repo,198.47.12.251,push:511c6906e2dfcfdcf8e616705c4021250ce9317c,2012-08-22 15:47:31.882017
 
738,134,asdf1234,,Master-Repo,"",user_updated_repo,2012-08-22 15:48:13.441863
 
739,134,asdf1234,,Master-Repo,198.47.12.251,push:650eab8084b7194849c714a7b8ee624ccb143961,2012-08-22 15:55:02.593373
 
741,1,default,,Master-Repo,176.9.28.203,pull,2012-08-22 15:55:55.777458
 
749,134,asdf1234,,Master-Repo,"",user_deleted_repo,2012-08-22 16:04:45.631529
 
746,134,asdf1234,,Master-repo-my-work,"",started_following_repo,2012-08-22 16:03:30.002885
 
747,134,asdf1234,,Master-repo-my-work,"",user_created_repo,2012-08-22 16:03:30.014977
 
748,134,asdf1234,,Master-repo-my-work,198.47.12.251,"push:511c6906e2dfcfdcf8e616705c4021250ce9317c,650eab8084b7194849c714a7b8ee624ccb143961,9e9ec10c23b2d7906221296e9b824e09aca4d135",2012-08-22 16:03:46.33517
 
750,134,asdf1234,,Master-repo-my-work,"",user_deleted_repo,2012-08-22 16:04:52.44082
 
742,134,asdf1234,,Master-Repo-work,"",started_following_repo,2012-08-22 15:55:55.950145
 
743,134,asdf1234,,Master-Repo-work,"",user_created_repo,2012-08-22 15:55:55.964648
 
744,1,default,,Master-Repo-work,198.47.12.251,pull,2012-08-22 15:56:19.314483
 
745,134,asdf1234,,Master-Repo-work,198.47.12.251,push:9e9ec10c23b2d7906221296e9b824e09aca4d135,2012-08-22 15:57:15.289776
 
751,134,asdf1234,,Master-Repo-work,"",user_deleted_repo,2012-08-22 16:05:17.555968
 
752,3,demo,90,a-fork1,"",user_commented_revision:5478c7d290bc0a14d9cefd79ed5722a87f3815d5,2012-08-22 16:55:58.931518
 
753,3,demo,88,group/project-z,"",user_updated_repo,2012-08-24 11:32:31.148489
 
754,3,demo,151,group/test2,"",started_following_repo,2012-08-24 15:44:04.072312
 
755,3,demo,151,group/test2,"",user_created_repo,2012-08-24 15:44:04.088381
 
756,3,demo,34,a,"",push_local:332932afc11a2c6308d44e75f8b4ac7643093fa7,2012-08-24 17:15:46.470802
 
757,136,buk,152,group/create_test,"",started_following_repo,2012-08-25 06:40:04.917748
 
758,136,buk,152,group/create_test,"",user_created_repo,2012-08-25 06:40:04.931544
 
759,136,buk,121,group/fork-clojure.git11111,"",user_updated_repo,2012-08-25 06:42:39.902167
 
760,140,ryanewtaylor,153,my_test_repository,"",started_following_repo,2012-08-27 03:06:53.764986
 
761,140,ryanewtaylor,153,my_test_repository,"",user_created_repo,2012-08-27 03:06:53.777712
 
763,140,ryanewtaylor,153,my_test_repository,"",user_commented_revision:adca53fe04fd153232ba0f2b0849593d7e7e66b3,2012-08-27 03:13:37.332593
 
764,140,ryanewtaylor,153,my_test_repository,"",user_commented_revision:adca53fe04fd153232ba0f2b0849593d7e7e66b3,2012-08-27 03:14:12.752967
 
765,140,ryanewtaylor,153,my_test_repository,"",user_commented_revision:adca53fe04fd153232ba0f2b0849593d7e7e66b3,2012-08-27 03:14:51.684298
 
766,140,ryanewtaylor,153,my_test_repository,"",user_commented_revision:6669f75a9cb677a2fda670b38b1144148ebeb962,2012-08-27 03:15:12.583256
 
767,140,ryanewtaylor,153,my_test_repository,"",user_commented_revision:df1618708e7fa0c17d5f6b45c20862c22ddec32e,2012-08-27 03:16:16.068448
 
768,140,ryanewtaylor,153,my_test_repository,"",user_commented_revision:df1618708e7fa0c17d5f6b45c20862c22ddec32e,2012-08-27 03:16:21.558262
 
769,2,admin,153,my_test_repository,"",user_commented_revision:6669f75a9cb677a2fda670b38b1144148ebeb962,2012-08-27 09:57:00.382062
 
770,141,asdf1234asdf,93,fork-a,"",user_commented_pull_request:29,2012-08-28 00:15:33.186954
 
771,141,asdf1234asdf,93,fork-a,"",user_closed_pull_request:29,2012-08-28 00:15:33.199962
 
773,143,demodemo1,93,fork-a,"",user_commented_revision:7f8b4f94e2a83394aa687e0bb110870769e9ca0a,2012-08-29 09:44:47.573503
 
774,3,demo,90,a-fork1,"",push_local:323f852b71ad55dde8b5134ecab08d38e478a2c5,2012-08-29 11:07:26.784421
 
775,116,japanfred,156,jf-main,"",started_following_repo,2012-08-29 14:07:27.6853
 
776,116,japanfred,156,jf-main,"",user_created_repo,2012-08-29 14:07:27.698708
 
777,116,japanfred,156,jf-main,"",push_local:3da6f8032b842427e3873733bc997cc38870028c,2012-08-29 14:08:26.649182
 
778,116,japanfred,156,group/jf-main,"",user_updated_repo,2012-08-29 14:08:51.803377
 
779,145,fthomas64,157,group/fintest,"",started_following_repo,2012-08-29 21:54:55.55875
 
780,145,fthomas64,157,group/fintest,"",user_created_repo,2012-08-29 21:54:55.5727
 
781,145,fthomas64,157,group/fintest,"",user_updated_repo,2012-08-29 21:56:46.846955
 
782,3,demo,158,mytest001,"",started_following_repo,2012-08-29 23:38:29.423035
 
783,3,demo,158,mytest001,"",user_created_repo,2012-08-29 23:38:29.434528
 
784,3,demo,158,mytest001,"",user_updated_repo,2012-08-29 23:40:30.218875
 
785,3,demo,158,mytest001,"",push_local:877dd37e0d11c11006ba333eea74972f8f3c0745,2012-08-29 23:56:55.750242
 
786,3,demo,158,mytest001,"",user_commented_revision:877dd37e0d11c11006ba333eea74972f8f3c0745,2012-08-29 23:57:17.769527
 
787,3,demo,158,mytest001,"",user_commented_revision:877dd37e0d11c11006ba333eea74972f8f3c0745,2012-08-30 00:00:06.214755
 
788,3,demo,86,qbtest,"",user_commented_revision:04acb5b4d5e0baeedde09ab9f4921ebfd8a44fe3,2012-08-30 18:18:52.127137
 
789,3,demo,86,qbtest,"",user_commented_revision:04acb5b4d5e0baeedde09ab9f4921ebfd8a44fe3,2012-08-30 18:19:39.559827
 
790,3,demo,159,group/Test-for-code-review,"",started_following_repo,2012-08-30 18:21:15.38201
 
791,3,demo,159,group/Test-for-code-review,"",user_created_repo,2012-08-30 18:21:15.396876
 
792,3,demo,159,group/Test-for-code-review,"",push_local:2305443e5a06a9d80e328741d2da742145f80eee,2012-08-30 18:22:30.576129
 
793,3,demo,159,group/Test-for-code-review,"",user_commented_revision:2305443e5a06a9d80e328741d2da742145f80eee,2012-08-30 18:25:35.145053
 
794,3,demo,159,group/Test-for-code-review,"",user_commented_revision:2305443e5a06a9d80e328741d2da742145f80eee,2012-08-30 18:25:55.638486
 
795,3,demo,159,group/Test-for-code-review,"",user_commented_revision:2305443e5a06a9d80e328741d2da742145f80eee,2012-08-30 18:26:45.22087
 
796,3,demo,159,group/Test-for-code-review,"",user_updated_repo,2012-08-30 18:28:52.430153
 
797,3,demo,159,group/Test-for-code-review,"",user_updated_repo,2012-08-30 18:28:59.540779
 
798,3,demo,159,group/Test-for-code-review,"",user_updated_repo,2012-08-30 18:46:21.757499
 
799,3,demo,159,group/Test-for-code-review,"",push_local:1ea6c5155c207b823306f6d4135975cd62de5ea6,2012-08-30 19:06:37.805225
 
800,3,demo,159,group/Test-for-code-review,"",user_commented_revision:1ea6c5155c207b823306f6d4135975cd62de5ea6,2012-08-30 19:07:57.905038
 
801,1,default,159,group/Test-for-code-review,176.9.28.203,pull,2012-08-30 19:12:18.946031
 
802,3,demo,160,group/test-der-zweite,"",started_following_repo,2012-08-30 19:12:19.100001
 
803,3,demo,160,group/test-der-zweite,"",user_created_repo,2012-08-30 19:12:19.109789
 
804,3,demo,160,group/test-der-zweite,"",user_commented_revision:1ea6c5155c207b823306f6d4135975cd62de5ea6,2012-08-30 19:12:33.306323
 
805,3,demo,159,group/Test-for-code-review,"",user_commented_revision:1ea6c5155c207b823306f6d4135975cd62de5ea6,2012-08-30 19:14:51.326684
 
806,3,demo,159,group/Test-for-code-review,"",user_commented_revision:1ea6c5155c207b823306f6d4135975cd62de5ea6,2012-08-30 19:14:54.354662
 
807,3,demo,159,group/Test-for-code-review,"",user_commented_revision:2305443e5a06a9d80e328741d2da742145f80eee,2012-08-30 19:15:23.722829
 
808,150,dlamotte,1,test,"",user_commented_pull_request:31,2012-08-30 23:03:25.180892
 
809,150,dlamotte,1,test,"",user_closed_pull_request:31,2012-08-30 23:03:25.192118
 
810,150,dlamotte,161,test-rhodecode-pull-request,"",started_following_repo,2012-08-30 23:05:08.817245
 
811,150,dlamotte,161,test-rhodecode-pull-request,"",user_created_repo,2012-08-30 23:05:08.832769
 
812,150,dlamotte,161,test-rhodecode-pull-request,143.127.128.10,push:e839aac4f06bb1f0dde813d6b7e80cc345f8d70d,2012-08-30 23:06:12.300969
 
813,150,dlamotte,161,test-rhodecode-pull-request,143.127.128.10,"push:1b01a9f3ba4951615f1c9cfbe19ea62f3abeed9f,062ab363eaef7fc73342a93f4624030103fc36f9",2012-08-30 23:08:29.621962
 
814,1,default,1,test,176.9.28.203,pull,2012-08-30 23:14:51.336754
 
815,151,mill1359,162,test-m,"",started_following_repo,2012-08-30 23:14:51.499881
 
816,151,mill1359,162,test-m,"",user_created_repo,2012-08-30 23:14:51.509169
 
817,1,default,162,test-m,143.127.128.10,pull,2012-08-30 23:16:00.219245
 
818,151,mill1359,162,test-m,143.127.128.10,push:8a528cebe032d5502c73608281a954233347ce36,2012-08-30 23:19:20.205642
 
819,151,mill1359,162,test-m,"",user_commented_pull_request:32,2012-08-30 23:21:27.6093
 
820,151,mill1359,162,test-m,"",user_closed_pull_request:32,2012-08-30 23:21:27.617668
 
821,155,cdugz,163,nagios,"",started_following_repo,2012-08-31 16:42:33.825148
 
822,155,cdugz,163,nagios,"",user_created_repo,2012-08-31 16:42:33.83886
 
895,3,demo,122,amab,"",push_local:f0509a4f718f5a31eafcb8fbe9caf21a642c5753,2012-09-05 01:30:02.737976
 
896,3,demo,32,big-project,"",user_commented_revision:06d5302c4830e5af52f06c462f11f75107b2a1ff,2012-09-05 11:05:19.904842
 
823,155,cdugz,163,nagios,82.150.248.28,"push:380d5c3fd6c3948d5da3f56859104f4adf629553,30b5773f0f9d57cfb721576169685b36878969d1,47deef50eface398daa8ba09a6d79a9db2585c4f,a38d5508f516f360cd603a72cd4a4f16facf5825,cf7656e6c2cb29241db1f6ae0af2823684d7d0b4,0ebf06f94b584abe59853618ca68b9416f13fe20,413886edff138d8de1e3e23698fabba444de6167,335bb28b7c5428044f17ef9bc57a992b759b2d93,feba8837f9ac8af56b6588e8fcc7710eeeebd327,bf0781be32a59aef35f8bf95a2f614894e773926,fc3792349c770fe014d0774e980e3bba600bb5a6",2012-08-31 16:46:05.896127
 
824,155,cdugz,164,rhodecode-ref,"",started_following_repo,2012-08-31 17:42:24.794235
 
825,155,cdugz,164,rhodecode-ref,"",user_created_repo,2012-08-31 17:42:24.806839
 
826,155,cdugz,164,rhodecode-ref,82.150.248.28,"push:380d5c3fd6c3948d5da3f56859104f4adf629553,30b5773f0f9d57cfb721576169685b36878969d1,47deef50eface398daa8ba09a6d79a9db2585c4f,c91bea8206218cf051c6b0ab6a352c7371b5212d",2012-08-31 17:43:03.365708
 
827,155,cdugz,164,rhodecode-ref,"",user_updated_repo,2012-08-31 17:44:01.673127
 
828,155,cdugz,165,rhodecode-dev,"",started_following_repo,2012-08-31 17:44:52.870468
 
829,155,cdugz,165,rhodecode-dev,"",user_created_repo,2012-08-31 17:44:52.880649
 
830,155,cdugz,165,rhodecode-dev,82.150.248.28,"push:380d5c3fd6c3948d5da3f56859104f4adf629553,30b5773f0f9d57cfb721576169685b36878969d1,47deef50eface398daa8ba09a6d79a9db2585c4f,107236f51ef01fcb27d1c613c18a93a2135c336c,2ff774f5163960e356530826b4faad804bd79972,e4b37340f046c2910a43017d814841df1caec1cf,c91bea8206218cf051c6b0ab6a352c7371b5212d,3e5071670c8eec699744bd94f9ebacba8ef33b1f,06303e4e0da2b0e909d985844fc573e3a32547a2",2012-08-31 17:45:20.027085
 
831,3,demo,93,fork-a,"",push_local:416552904882d8b8f051cad2071f4aa271d4ea4e,2012-08-31 18:50:50.885869
 
832,3,demo,166,dfgdfg,"",started_following_repo,2012-08-31 18:56:16.94572
 
833,3,demo,166,dfgdfg,"",user_created_repo,2012-08-31 18:56:16.959102
 
834,3,demo,166,dfgdfg,"",user_updated_repo,2012-08-31 18:56:40.349443
 
835,3,demo,166,dfgdfg,"",user_updated_repo,2012-08-31 18:56:43.138614
 
836,3,demo,167,group/test1234,"",started_following_repo,2012-09-01 13:16:21.279844
 
837,3,demo,167,group/test1234,"",user_created_repo,2012-09-01 13:16:21.293767
 
838,3,demo,168,group/test_interface,"",started_following_repo,2012-09-01 16:31:43.486262
 
839,3,demo,168,group/test_interface,"",user_created_repo,2012-09-01 16:31:43.500171
 
840,3,demo,169,group/demo_interface,"",started_following_repo,2012-09-01 16:33:21.416702
 
841,3,demo,169,group/demo_interface,"",user_created_repo,2012-09-01 16:33:21.429822
 
842,3,demo,169,group/demo_interface,"",user_updated_repo,2012-09-01 16:34:48.888958
 
843,2,admin,,"","",admin_updated_user:demo,2012-09-01 21:37:36.22824
 
844,2,admin,42,foo,"",admin_updated_repo,2012-09-01 21:38:55.72173
 
845,3,demo,68,aaa-project,"",user_commented_revision:2babd97db425482a53b679956df09f89c3154a2c,2012-09-02 02:19:55.864414
 
846,3,demo,68,aaa-project,"",user_commented_revision:2babd97db425482a53b679956df09f89c3154a2c,2012-09-02 02:22:04.179327
 
847,3,demo,68,aaa-project,"",user_commented_revision:2babd97db425482a53b679956df09f89c3154a2c,2012-09-02 02:22:20.301017
 
848,167,asegarra,124,fork-another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-09-03 00:00:02.708105
 
849,167,asegarra,124,fork-another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-09-03 00:00:15.395196
 
850,3,demo,34,a,"",user_commented_revision:332932afc11a2c6308d44e75f8b4ac7643093fa7,2012-09-03 04:40:41.834982
 
851,3,demo,34,a,"",user_commented_revision:332932afc11a2c6308d44e75f8b4ac7643093fa7,2012-09-03 07:13:57.839857
 
852,3,demo,34,a,"",user_commented_revision:332932afc11a2c6308d44e75f8b4ac7643093fa7,2012-09-03 07:15:33.483452
 
853,3,demo,34,a,"",user_commented_revision:332932afc11a2c6308d44e75f8b4ac7643093fa7,2012-09-03 07:28:27.434639
 
854,2,admin,,"","",admin_updated_users_group:group,2012-09-03 08:20:10.984426
 
855,2,admin,,"","",admin_updated_users_group:group,2012-09-03 08:20:22.82228
 
856,2,admin,68,aaa-project,"",admin_updated_repo,2012-09-03 08:28:23.441904
 
857,3,demo,170,_01_jdj,"",started_following_repo,2012-09-03 09:52:03.080751
 
858,3,demo,170,_01_jdj,"",user_created_repo,2012-09-03 09:52:03.103369
 
859,3,demo,171,releases/Blabla,"",started_following_repo,2012-09-03 13:45:50.257273
 
860,3,demo,171,releases/Blabla,"",user_created_repo,2012-09-03 13:45:50.271441
 
861,3,demo,171,releases/Blabla,"",stopped_following_repo,2012-09-03 13:46:24.790546
 
862,3,demo,171,releases/Blabla,"",started_following_repo,2012-09-03 13:46:34.42949
 
863,3,demo,171,releases/Blabla,"",stopped_following_repo,2012-09-03 13:46:37.546423
 
864,3,demo,171,releases/Blabla,"",started_following_repo,2012-09-03 13:46:37.766286
 
865,3,demo,171,releases/Blabla,"",stopped_following_repo,2012-09-03 13:46:38.018055
 
866,3,demo,171,releases/Blabla,"",started_following_repo,2012-09-03 13:46:40.717862
 
867,3,demo,171,releases/Blabla,"",stopped_following_repo,2012-09-03 13:46:40.849278
 
868,3,demo,171,releases/Blabla,"",started_following_repo,2012-09-03 13:46:41.061175
 
869,2,admin,172,go,"",started_following_repo,2012-09-03 14:30:41.496854
 
870,2,admin,172,go,"",admin_created_repo,2012-09-03 14:30:41.508885
 
871,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-09-04 02:08:20.759339
 
872,3,demo,34,a,"",user_commented_revision:332932afc11a2c6308d44e75f8b4ac7643093fa7,2012-09-04 02:20:58.295369
 
873,3,demo,34,a,"",user_commented_revision:332932afc11a2c6308d44e75f8b4ac7643093fa7,2012-09-04 02:40:16.584952
 
874,3,demo,173,code-review-dev,"",started_following_repo,2012-09-04 13:01:06.110732
 
875,3,demo,173,code-review-dev,"",user_created_repo,2012-09-04 13:01:06.150884
 
876,3,demo,173,code-review-dev,195.238.92.121,push:cb2ea0ebb59413e325470ee63aa83bb84d9d126c,2012-09-04 13:02:03.374983
 
877,3,demo,173,code-review-dev,"",push_local:ae44a27e7e02d679b00bb94c04c2348d2ca88cd6,2012-09-04 13:03:50.249481
 
878,3,demo,173,code-review-dev,"",user_updated_repo,2012-09-04 13:04:13.26806
 
879,3,demo,173,code-review-dev,"",user_updated_repo,2012-09-04 13:04:17.650534
 
880,3,demo,173,code-review-dev,"",user_updated_repo,2012-09-04 13:05:42.76781
 
881,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-09-04 15:59:58.584723
 
882,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-09-04 16:00:08.318723
 
883,3,demo,174,cruel-test-2,"",started_following_repo,2012-09-04 16:57:50.235592
 
884,3,demo,174,cruel-test-2,"",user_created_repo,2012-09-04 16:57:50.255676
 
885,3,demo,174,cruel-test-2,"",push_local:b396ac3c7f6c18caf55a87abd84847d345732805,2012-09-04 16:58:25.458669
 
886,3,demo,174,cruel-test-2,"",push_local:a5419e86108ea38b872c9cb0880c312d2595c2aa,2012-09-04 16:59:21.3612
 
887,3,demo,174,cruel-test-2,"",user_commented_revision:a5419e86108ea38b872c9cb0880c312d2595c2aa,2012-09-04 17:01:36.969813
 
888,3,demo,33,fork-big-project,"",push_local:51cec0b8c8a0e47d8edc81d5ffb5f77723c5cbf9,2012-09-04 17:07:03.988595
 
889,3,demo,32,big-project,"",user_commented_pull_request:34,2012-09-04 17:09:12.417908
 
890,3,demo,32,big-project,"",user_commented_pull_request:34,2012-09-04 17:10:04.92285
 
891,3,demo,32,big-project,"",user_closed_pull_request:34,2012-09-04 17:10:04.927287
 
892,3,demo,34,a,"",user_updated_repo,2012-09-05 00:47:01.089512
 
893,3,demo,34,a,"",user_updated_repo,2012-09-05 00:47:11.588561
 
894,3,demo,24,fork-Something,"",user_updated_repo,2012-09-05 01:03:09.893608
 
897,1,default,66,pm-test,195.160.233.181,pull,2012-09-05 13:12:04.976374
 
898,3,demo,66,pm-test,195.160.233.181,push:d19c8fc1bfa2d661d4240e8f120f4ecf6267f9fa,2012-09-05 13:12:51.274952
 
899,3,demo,8,Test_Repo,"",user_commented_pull_request:35,2012-09-05 13:14:25.686481
 
900,3,demo,8,Test_Repo,"",user_commented_pull_request:35,2012-09-05 13:14:43.033131
 
901,3,demo,8,Test_Repo,"",user_closed_pull_request:35,2012-09-05 13:14:43.04395
 
902,1,default,8,Test_Repo,195.160.233.181,pull,2012-09-05 13:17:38.089185
 
903,3,demo,8,Test_Repo,195.160.233.181,push:e8ad7b21735b6590c2dd476e7628ba331a1df384,2012-09-05 13:18:07.5396
 
904,3,demo,175,fork-a-one-more,"",started_following_repo,2012-09-05 13:20:22.809301
 
905,3,demo,34,a,"",user_forked_repo:fork-a-one-more,2012-09-05 13:20:22.832688
 
906,3,demo,175,fork-a-one-more,"",user_created_fork:fork-a-one-more,2012-09-05 13:20:22.841274
 
907,3,demo,175,fork-a-one-more,195.160.233.181,pull,2012-09-05 13:20:54.391748
 
908,3,demo,175,fork-a-one-more,195.160.233.181,push:c6fb8c3fe1a8393f8861c39bf590d3865c503ca5,2012-09-05 13:22:36.203898
 
909,3,demo,34,a,"",user_commented_pull_request:36,2012-09-05 13:23:55.420971
 
910,3,demo,34,a,"",user_commented_pull_request:36,2012-09-05 13:24:17.361904
 
911,3,demo,34,a,"",user_commented_pull_request:36,2012-09-05 13:24:35.76659
 
912,3,demo,34,a,"",user_closed_pull_request:36,2012-09-05 13:24:35.7744
 
913,3,demo,34,a,"",user_commented_pull_request:37,2012-09-05 13:30:57.812004
 
914,3,demo,34,a,"",user_commented_pull_request:38,2012-09-05 13:38:45.300458
 
915,3,demo,34,a,"",user_commented_pull_request:38,2012-09-05 13:39:01.382629
 
916,3,demo,34,a,"",user_commented_pull_request:38,2012-09-05 13:39:18.062238
 
917,3,demo,34,a,"",user_commented_pull_request:38,2012-09-05 13:39:27.350966
 
918,3,demo,34,a,"",user_commented_pull_request:38,2012-09-05 13:39:37.275952
 
919,3,demo,34,a,"",user_updated_repo,2012-09-05 13:40:21.966185
 
920,3,demo,34,a,"",user_commented_pull_request:37,2012-09-05 13:40:53.832787
 
921,3,demo,34,a,"",user_closed_pull_request:37,2012-09-05 13:40:53.837264
 
922,3,demo,34,a,"",user_commented_pull_request:38,2012-09-05 13:41:51.071776
 
923,3,demo,34,a,"",user_closed_pull_request:38,2012-09-05 13:41:51.082763
 
924,3,demo,34,a,"",user_updated_repo,2012-09-05 13:42:28.045216
 
925,3,demo,176,hopsa,"",started_following_repo,2012-09-05 14:12:14.479866
 
926,3,demo,165,rhodecode-dev,"",user_forked_repo:hopsa,2012-09-05 14:12:14.495649
 
927,3,demo,176,hopsa,"",user_created_fork:hopsa,2012-09-05 14:12:14.507312
 
928,3,demo,177,blah,"",started_following_repo,2012-09-05 16:42:29.860682
 
929,3,demo,177,blah,"",user_created_repo,2012-09-05 16:42:29.876509
 
930,3,demo,178,myfolder-myrepo,"",started_following_repo,2012-09-05 17:33:08.753339
 
931,3,demo,178,myfolder-myrepo,"",user_created_repo,2012-09-05 17:33:08.765789
 
932,3,demo,180,MineReps,"",started_following_repo,2012-09-05 23:11:25.562383
 
933,3,demo,180,MineReps,"",user_created_repo,2012-09-05 23:11:25.577972
 
934,3,demo,33,fork-big-project,"",user_commented_revision:51cec0b8c8a0e47d8edc81d5ffb5f77723c5cbf9,2012-09-06 01:29:52.749682
 
935,3,demo,33,fork-big-project,"",user_commented_revision:51cec0b8c8a0e47d8edc81d5ffb5f77723c5cbf9,2012-09-06 01:30:05.246986
 
936,1,default,68,aaa-project,94.194.60.137,pull,2012-09-06 02:51:08.186518
 
937,1,default,68,aaa-project,94.194.60.137,pull,2012-09-06 02:54:47.80033
 
938,1,default,159,group/Test-for-code-review,"",push_local:e25e53f9a9cd4a39bb085830a67983bc6dd46e76,2012-09-06 03:08:45.578824
 
939,3,demo,159,group/Test-for-code-review,"",user_commented_revision:e25e53f9a9cd4a39bb085830a67983bc6dd46e76,2012-09-06 03:30:51.35489
 
940,3,demo,68,aaa-project,"",user_updated_repo,2012-09-06 04:44:10.863264
 
941,3,demo,68,aaa-project,"",user_updated_repo,2012-09-06 04:44:41.091954
 
942,3,demo,68,aaa-project,"",push_local:e3fef0be8dc20eb1fa68fc45292d9d66de1cc67f,2012-09-06 04:45:38.572986
 
943,3,demo,68,aaa-project,"",user_commented_revision:e3fef0be8dc20eb1fa68fc45292d9d66de1cc67f,2012-09-06 04:57:07.744368
 
944,3,demo,68,aaa-project,"",push_local:bc829c34912709c7d129e5dae9a3e5ff46e77fc7,2012-09-06 04:57:36.830617
 
945,3,demo,68,aaa-project,"",user_commented_revision:bc829c34912709c7d129e5dae9a3e5ff46e77fc7,2012-09-06 04:58:00.171714
 
946,3,demo,68,aaa-project,"",user_commented_revision:e3fef0be8dc20eb1fa68fc45292d9d66de1cc67f,2012-09-06 05:01:46.10616
 
947,3,demo,68,aaa-project,"",user_updated_repo,2012-09-06 05:03:07.692388
 
948,2,admin,,"","",admin_updated_user:ThunderEagle,2012-09-06 09:36:46.171404
 
949,2,admin,,"","",admin_updated_user:nipocetyueai,2012-09-06 09:36:50.92007
 
950,2,admin,,"","",admin_updated_user:mnemonikk,2012-09-06 09:36:56.872411
 
951,2,admin,,"","",admin_updated_user:kasai,2012-09-06 09:37:01.993148
 
952,2,admin,,"","",admin_updated_user:Gerhard,2012-09-06 09:37:06.197752
 
953,2,admin,,"","",admin_updated_user:dtucker,2012-09-06 09:37:10.301831
 
954,3,demo,181,group/MyTestRepo,"",started_following_repo,2012-09-06 15:19:51.89625
 
955,3,demo,181,group/MyTestRepo,"",user_created_repo,2012-09-06 15:19:51.912381
 
956,182,nohj,93,fork-a,"",user_commented_revision:7f8b4f94e2a83394aa687e0bb110870769e9ca0a,2012-09-07 09:42:56.913732
 
957,182,nohj,93,fork-a,"",user_commented_revision:7f8b4f94e2a83394aa687e0bb110870769e9ca0a,2012-09-07 09:43:06.314091
 
958,3,demo,182,releases/test,"",started_following_repo,2012-09-07 11:22:43.780986
 
959,3,demo,182,releases/test,"",user_created_repo,2012-09-07 11:22:43.795541
 
960,3,demo,183,releases/fork-test,"",started_following_repo,2012-09-07 11:23:52.711668
 
961,3,demo,182,releases/test,"",user_forked_repo:releases/fork-test,2012-09-07 11:23:52.72963
 
962,3,demo,183,releases/fork-test,"",user_created_fork:releases/fork-test,2012-09-07 11:23:52.742467
 
963,3,demo,184,fork-aaa-project,"",started_following_repo,2012-09-07 11:28:35.495082
 
964,3,demo,68,aaa-project,"",user_forked_repo:fork-aaa-project,2012-09-07 11:28:35.510311
 
965,3,demo,184,fork-aaa-project,"",user_created_fork:fork-aaa-project,2012-09-07 11:28:35.523318
 
966,3,demo,184,fork-aaa-project,"",push_local:b25fcd2b8f033115be20d9146c99c1aa6854dff0,2012-09-07 11:29:20.828412
 
967,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-09-07 11:32:38.639523
 
968,3,demo,185,TestRepositoryCS,"",started_following_repo,2012-09-07 13:53:39.687423
 
969,3,demo,185,TestRepositoryCS,"",user_created_repo,2012-09-07 13:53:39.702762
 
970,3,demo,186,releases/softpedia,"",started_following_repo,2012-09-07 14:23:28.805185
 
971,3,demo,186,releases/softpedia,"",user_created_repo,2012-09-07 14:23:28.815298
 
972,3,demo,187,ptest,"",started_following_repo,2012-09-07 20:29:00.365852
 
973,3,demo,187,ptest,"",user_created_repo,2012-09-07 20:29:00.379277
 
974,3,demo,187,ptest,89.72.81.164,push:527819ac5de5c1ef222e10faa94d00031ff92276,2012-09-07 20:35:02.456136
 
975,3,demo,187,ptest,89.72.81.164,push:20312aeb821607689952b2e56de6167927c2790b,2012-09-07 20:40:50.055559
 
976,3,demo,187,ptest,"",user_commented_revision:20312aeb821607689952b2e56de6167927c2790b,2012-09-07 20:43:26.445007
 
977,141,asdf1234asdf,188,fork-Asdf,"",started_following_repo,2012-09-07 21:22:53.452145
 
978,141,asdf1234asdf,135,Asdf,"",user_forked_repo:fork-Asdf,2012-09-07 21:22:53.472411
 
979,141,asdf1234asdf,188,fork-Asdf,"",user_created_fork:fork-Asdf,2012-09-07 21:22:53.485295
 
980,141,asdf1234asdf,188,fork-Asdf,"",push_local:cf7c116b1345f1aa0b1df0d1c36abce396082561,2012-09-07 21:23:31.404039
 
981,141,asdf1234asdf,135,Asdf,"",user_commented_pull_request:40,2012-09-07 21:24:53.455489
 
982,141,asdf1234asdf,135,Asdf,"",user_closed_pull_request:40,2012-09-07 21:24:53.467808
 
983,3,demo,68,aaa-project,"",user_commented_revision:bc829c34912709c7d129e5dae9a3e5ff46e77fc7,2012-09-07 22:54:29.053992
 
984,3,demo,189,fork-_01_jdj,"",started_following_repo,2012-09-07 22:55:46.169783
 
985,3,demo,170,_01_jdj,"",user_forked_repo:fork-_01_jdj,2012-09-07 22:55:46.191342
 
986,3,demo,189,fork-_01_jdj,"",user_created_fork:fork-_01_jdj,2012-09-07 22:55:46.209143
 
987,2,admin,190,rhodecode,"",started_following_repo,2012-09-08 01:07:09.881091
 
988,2,admin,190,rhodecode,"",admin_created_repo,2012-09-08 01:07:09.895097
 
989,3,demo,34,a,"",user_commented_revision:332932afc11a2c6308d44e75f8b4ac7643093fa7,2012-09-08 08:57:27.586796
 
990,3,demo,191,kekeke,"",started_following_repo,2012-09-08 11:22:58.159504
 
991,3,demo,191,kekeke,"",user_created_repo,2012-09-08 11:22:58.175212
 
992,3,demo,191,kekeke,"",push_local:40926265e8964e7b71381c9c9e1d3c4dbdd158cc,2012-09-08 11:23:11.019021
 
993,3,demo,191,kekeke,"",user_commented_revision:40926265e8964e7b71381c9c9e1d3c4dbdd158cc,2012-09-08 11:23:26.28488
 
994,3,demo,192,fork-kekeke,"",started_following_repo,2012-09-08 11:23:53.101414
 
995,3,demo,191,kekeke,"",user_forked_repo:fork-kekeke,2012-09-08 11:23:53.115395
 
996,3,demo,192,fork-kekeke,"",user_created_fork:fork-kekeke,2012-09-08 11:23:53.129381
 
997,3,demo,192,fork-kekeke,"",push_local:f6c6170cb0cd27fd21d4a8f4ae477bb86ee67e6e,2012-09-08 11:24:25.629176
 
998,3,demo,192,fork-kekeke,"",user_commented_revision:f6c6170cb0cd27fd21d4a8f4ae477bb86ee67e6e,2012-09-08 11:24:36.698761
 
999,3,demo,192,fork-kekeke,"",user_commented_revision:f6c6170cb0cd27fd21d4a8f4ae477bb86ee67e6e,2012-09-08 11:26:01.605011
 
1000,3,demo,193,swamp,"",started_following_repo,2012-09-08 11:27:28.069118
 
1001,3,demo,193,swamp,"",user_created_repo,2012-09-08 11:27:28.079797
 
1002,3,demo,193,swamp,"",push_local:c4cd716a477bd604e57f8a07c28462f2e55b1282,2012-09-08 11:27:40.680692
 
1003,3,demo,194,fork-swamp,"",started_following_repo,2012-09-08 11:28:05.141092
 
1004,3,demo,193,swamp,"",user_forked_repo:fork-swamp,2012-09-08 11:28:05.223876
 
1005,3,demo,194,fork-swamp,"",user_created_fork:fork-swamp,2012-09-08 11:28:05.233149
 
1006,3,demo,194,fork-swamp,"",push_local:cdf8380186a792bffb9be284df1bd95c631143ca,2012-09-08 11:28:33.802256
 
1007,3,demo,193,swamp,"",user_commented_pull_request:41,2012-09-08 11:29:22.818392
 
1008,3,demo,193,swamp,"",user_closed_pull_request:41,2012-09-08 11:29:22.824771
 
1009,3,demo,193,swamp,"",user_updated_repo,2012-09-08 11:32:58.174439
 
1010,3,demo,,group/book,"",started_following_repo,2012-09-08 18:59:38.392464
 
1011,3,demo,,group/book,"",user_created_repo,2012-09-08 18:59:38.412482
 
1012,3,demo,,group/book,"",push_local:da7ffa14ae51096c974b2297cfd8a10009b44266,2012-09-08 19:01:38.20195
 
1013,3,demo,,group/book,"",stopped_following_repo,2012-09-08 19:04:50.017367
 
1014,3,demo,,group/book,"",user_deleted_repo,2012-09-08 19:09:36.059085
 
1015,183,dotnet,196,PD,"",started_following_repo,2012-09-08 22:57:37.558354
 
1016,183,dotnet,196,PD,"",user_created_repo,2012-09-08 22:57:37.570947
 
1017,183,dotnet,196,group/PD,"",user_updated_repo,2012-09-08 22:58:13.674462
 
1018,3,demo,197,CollectionQuery,"",started_following_repo,2012-09-09 00:58:29.372736
 
1019,3,demo,197,CollectionQuery,"",user_created_repo,2012-09-09 00:58:29.391956
 
1020,3,demo,197,CollectionQuery,"",user_commented_revision:34f0cefd8f7fbddf412daddc8676483f71456e8d,2012-09-09 00:58:51.17291
 
1021,3,demo,197,CollectionQuery,"",user_commented_revision:34f0cefd8f7fbddf412daddc8676483f71456e8d,2012-09-09 00:58:56.364677
 
1022,3,demo,198,fork-CollectionQuery,"",started_following_repo,2012-09-09 00:59:36.116229
 
1023,3,demo,197,CollectionQuery,"",user_forked_repo:fork-CollectionQuery,2012-09-09 00:59:36.133811
 
1024,3,demo,198,fork-CollectionQuery,"",user_created_fork:fork-CollectionQuery,2012-09-09 00:59:36.214126
 
1025,3,demo,199,fork-fork-CollectionQuery,"",started_following_repo,2012-09-09 00:59:57.408192
 
1026,3,demo,198,fork-CollectionQuery,"",user_forked_repo:fork-fork-CollectionQuery,2012-09-09 00:59:57.423968
 
1027,3,demo,199,fork-fork-CollectionQuery,"",user_created_fork:fork-fork-CollectionQuery,2012-09-09 00:59:57.433065
 
1028,3,demo,199,fork-fork-CollectionQuery,195.43.146.59,push:69ce02e460b36f4c28a468ac1356b579b9a954ff,2012-09-09 01:01:22.306272
 
1029,3,demo,198,fork-CollectionQuery,"",user_commented_pull_request:42,2012-09-09 01:02:19.007376
 
1030,3,demo,198,fork-CollectionQuery,"",user_commented_pull_request:42,2012-09-09 01:02:27.274382
 
1031,3,demo,198,fork-CollectionQuery,"",user_commented_pull_request:42,2012-09-09 01:02:58.084638
 
1032,3,demo,198,fork-CollectionQuery,"",user_commented_pull_request:42,2012-09-09 01:03:24.236666
 
1033,3,demo,198,fork-CollectionQuery,"",user_closed_pull_request:42,2012-09-09 01:03:24.242005
 
1034,3,demo,199,fork-fork-CollectionQuery,"",user_updated_repo,2012-09-09 01:07:10.157164
 
1035,3,demo,200,group/MostafaTest,"",started_following_repo,2012-09-09 05:40:58.979338
 
1036,3,demo,200,group/MostafaTest,"",user_created_repo,2012-09-09 05:40:58.990523
 
1037,3,demo,200,group/MostafaTest,"",user_updated_repo,2012-09-09 05:41:48.334746
 
1055,184,testar,201,tord,"",user_commented_pull_request:44,2012-09-09 19:54:21.605064
 
1056,184,testar,201,tord,"",user_closed_pull_request:44,2012-09-09 19:54:21.613226
 
1039,3,demo,170,_01_jdj,"",user_updated_repo,2012-09-09 07:53:52.339713
 
1040,3,demo,170,_01_jdj,"",user_updated_repo,2012-09-09 07:54:26.72259
 
1041,3,demo,170,group/_01_jdj,"",user_updated_repo,2012-09-09 07:55:38.58919
 
1042,184,testar,201,tord,"",started_following_repo,2012-09-09 18:14:16.86889
 
1043,184,testar,201,tord,"",user_created_repo,2012-09-09 18:14:16.882512
 
1044,184,testar,163,nagios,"",started_following_repo,2012-09-09 18:15:38.62944
 
1045,184,testar,201,tord,"",push_local:35b3ebc8e1c23902eb97031f42f666df0835c5be,2012-09-09 18:19:47.818844
 
1046,184,testar,202,fork-tord,"",started_following_repo,2012-09-09 18:20:57.856478
 
1047,184,testar,201,tord,"",user_forked_repo:fork-tord,2012-09-09 18:20:57.874063
 
1048,184,testar,202,fork-tord,"",user_created_fork:fork-tord,2012-09-09 18:20:57.882599
 
1049,184,testar,202,fork-tord,"",push_local:9a2c544511d0a4acd495e8ea5731a8991a74282e,2012-09-09 18:21:38.707225
 
1050,184,testar,201,tord,"",user_commented_pull_request:43,2012-09-09 18:25:50.104238
 
1051,184,testar,201,tord,"",user_closed_pull_request:43,2012-09-09 18:25:50.113446
 
1052,184,testar,201,tord,"",user_commented_pull_request:44,2012-09-09 18:27:24.712191
 
1053,184,testar,201,tord,"",user_commented_pull_request:44,2012-09-09 18:28:22.083687
 
1054,184,testar,201,tord,"",user_updated_repo,2012-09-09 18:29:15.858734
 
1057,185,robert.zaremba,90,a-fork1,"",user_commented_revision:b09d43f798414bcbdf4dc1fc5dafe6ce4aa5afc3,2012-09-09 22:27:16.614006
 
1058,185,robert.zaremba,90,a-fork1,"",user_commented_revision:7672806f881f67eb1441d00b16e983e761127cb6,2012-09-09 22:32:41.43306
 
1059,185,robert.zaremba,90,a-fork1,"",user_commented_revision:7672806f881f67eb1441d00b16e983e761127cb6,2012-09-09 22:33:13.181212
 
1060,3,demo,203,testtt,"",started_following_repo,2012-09-10 09:06:26.895244
 
1061,3,demo,203,testtt,"",user_created_repo,2012-09-10 09:06:26.906878
 
1062,3,demo,34,a,"",user_commented_revision:7672806f881f67eb1441d00b16e983e761127cb6,2012-09-10 10:05:40.492293
 
1063,3,demo,68,aaa-project,"",user_commented_revision:bc829c34912709c7d129e5dae9a3e5ff46e77fc7,2012-09-10 18:01:16.277098
 
1064,3,demo,81,FS_dummy,"",user_updated_repo,2012-09-10 18:06:21.324052
 
1065,3,demo,204,releases/Sopra_testgd,"",started_following_repo,2012-09-10 18:11:02.020678
 
1066,3,demo,204,releases/Sopra_testgd,"",user_created_repo,2012-09-10 18:11:02.030205
 
1067,3,demo,204,releases/Sopra_testgd,"",push_local:284745170ffd9e889c2edfb0233b6d654e787fa9,2012-09-10 18:12:24.966918
 
1068,3,demo,204,releases/Sopra_testgd,"",user_commented_revision:284745170ffd9e889c2edfb0233b6d654e787fa9,2012-09-10 18:14:01.969763
 
1069,3,demo,205,releases/fork-Sopra_testgd,"",started_following_repo,2012-09-10 18:16:19.48076
 
1070,3,demo,204,releases/Sopra_testgd,"",user_forked_repo:releases/fork-Sopra_testgd,2012-09-10 18:16:19.499335
 
1071,3,demo,205,releases/fork-Sopra_testgd,"",user_created_fork:releases/fork-Sopra_testgd,2012-09-10 18:16:19.511534
 
1072,3,demo,205,releases/fork-Sopra_testgd,"",push_local:99095f2d5703cbc43294ef55a19c5cc9e4cc2c15,2012-09-10 18:21:23.60213
 
1073,189,bondsbw,57,SuperProject,"",user_commented_revision:a3188ce9ed64822ceae497665910c2e18cddf021,2012-09-10 22:54:09.907623
 
1074,189,bondsbw,122,amab,"",user_commented_revision:f0509a4f718f5a31eafcb8fbe9caf21a642c5753,2012-09-10 22:55:47.862221
 
1075,108,dukeofgaming,124,fork-another-fork-to-check-code-review,"",push_local:a48ce47517381c8ca647c5f5ed459cfd16c2d929,2012-09-11 19:49:34.961449
 
1076,3,demo,206,test-sls,"",started_following_repo,2012-09-11 22:38:29.066354
 
1077,3,demo,206,test-sls,"",user_created_repo,2012-09-11 22:38:29.079212
 
1078,3,demo,206,test-sls,"",push_local:dd00a017d1957479cfcde1e452b625de41dde9d2,2012-09-11 22:38:53.239821
 
1079,3,demo,207,fork-test-sls,"",started_following_repo,2012-09-11 22:39:50.010568
 
1080,3,demo,206,test-sls,"",user_forked_repo:fork-test-sls,2012-09-11 22:39:50.029999
 
1081,3,demo,207,fork-test-sls,"",user_created_fork:fork-test-sls,2012-09-11 22:39:50.043157
 
1082,3,demo,206,test-sls,"",push_local:c6b89acf0f7cd0b524001d0aa6f5ab3b83c30610,2012-09-11 22:40:31.203174
 
1083,3,demo,54,glib,"",user_commented_revision:538b2f106de78b7dfeac2a98f3d5594ed0ed2ade,2012-09-12 00:11:20.855342
 
1084,3,demo,54,glib,"",user_commented_revision:82d914d808c616d14d489c0272c6d5afc4bfbd5a,2012-09-12 00:12:22.85722
 
1085,3,demo,208,fork-foo-test-pull-request,"",started_following_repo,2012-09-12 05:01:27.90602
 
1086,3,demo,42,foo,"",user_forked_repo:fork-foo-test-pull-request,2012-09-12 05:01:30.440339
 
1087,3,demo,208,fork-foo-test-pull-request,"",user_created_fork:fork-foo-test-pull-request,2012-09-12 05:01:30.452552
 
1088,3,demo,208,fork-foo-test-pull-request,"",push_local:466e27f74322722e315290532fbcb304f6d58c89,2012-09-12 05:03:04.911355
 
1089,3,demo,209,simple,"",started_following_repo,2012-09-12 05:06:08.645688
 
1090,3,demo,209,simple,"",user_created_repo,2012-09-12 05:06:08.657642
 
1091,3,demo,209,simple,"",push_local:f486184ddd95d91608069a8551febd72e268f4df,2012-09-12 05:07:25.821515
 
1092,3,demo,210,simple-dev,"",started_following_repo,2012-09-12 05:08:21.036466
 
1093,3,demo,209,simple,"",user_forked_repo:simple-dev,2012-09-12 05:08:21.055166
 
1094,3,demo,210,simple-dev,"",user_created_fork:simple-dev,2012-09-12 05:08:21.069551
 
1095,3,demo,210,simple-dev,"",push_local:5041fad58a9214bf203d139c171a277c51bac1a3,2012-09-12 05:09:16.139893
 
1096,3,demo,209,simple,"",user_commented_pull_request:47,2012-09-12 05:11:57.925581
 
1097,3,demo,209,simple,"",user_commented_pull_request:47,2012-09-12 05:12:24.949869
 
1098,3,demo,209,simple,"",user_closed_pull_request:47,2012-09-12 05:12:24.958144
 
1099,1,default,209,simple,221.237.152.62,pull,2012-09-12 05:40:02.318983
 
1100,1,default,210,simple-dev,221.237.152.62,pull,2012-09-12 05:40:17.924834
 
1101,1,default,210,simple-dev,221.237.152.62,pull,2012-09-12 05:40:49.20005
 
1102,3,demo,209,simple,221.237.152.62,push:5041fad58a9214bf203d139c171a277c51bac1a3,2012-09-12 05:41:15.014744
 
1103,3,demo,210,simple-dev,"",push_local:bbcf483fdda92478ca6a00a0f14cc77815d5414f,2012-09-12 05:47:24.31048
 
1104,3,demo,210,simple-dev,"",user_updated_repo,2012-09-12 05:48:00.607586
 
1105,3,demo,209,simple,"",user_commented_pull_request:48,2012-09-12 05:49:58.582042
 
1106,3,demo,209,simple,"",user_closed_pull_request:48,2012-09-12 05:49:58.589388
 
1107,1,default,210,simple-dev,221.237.152.62,pull,2012-09-12 05:50:50.549103
 
1108,3,demo,209,simple,221.237.152.62,push:bbcf483fdda92478ca6a00a0f14cc77815d5414f,2012-09-12 05:51:17.124232
 
1109,3,demo,34,a,"",push_local:48e1ba33b7951b8e8023e3e3cc54ef2540f4e8f1,2012-09-12 08:36:56.839135
 
1110,3,demo,120,group/clojure.git,"",user_updated_repo,2012-09-12 10:03:47.644822
 
1111,3,demo,174,cruel-test-2,"",push_local:a0971ac6b506a17718c1544689f3f6cfc261576d,2012-09-12 10:54:25.099359
 
1112,3,demo,174,releases/cruel-test-2,"",user_updated_repo,2012-09-12 10:55:26.86657
 
1113,3,demo,174,releases/cruel-test-2,"",user_updated_repo,2012-09-12 10:55:30.573836
 
1114,2,admin,211,testé1,"",started_following_repo,2012-09-12 11:57:41.047778
 
1115,2,admin,211,testé1,"",admin_created_repo,2012-09-12 11:57:41.083287
 
1116,3,demo,169,group/demo_interface,"",user_updated_repo,2012-09-12 12:07:54.077355
 
1117,3,demo,174,releases/cruel-test-2,"",stopped_following_repo,2012-09-12 12:08:52.082216
 
1118,3,demo,174,releases/cruel-test-2,"",started_following_repo,2012-09-12 12:08:53.730447
 
1119,3,demo,174,releases/cruel-test-2,"",stopped_following_repo,2012-09-12 12:08:55.148237
 
1120,3,demo,209,simple,"",user_commented_revision:bbcf483fdda92478ca6a00a0f14cc77815d5414f,2012-09-12 12:12:45.729356
 
1121,3,demo,209,simple,"",user_commented_revision:5041fad58a9214bf203d139c171a277c51bac1a3,2012-09-12 12:14:55.164695
 
1122,193,test1234124890814,212,group/fork-aaa-project,"",started_following_repo,2012-09-12 21:55:02.137169
 
1123,193,test1234124890814,68,aaa-project,"",user_forked_repo:group/fork-aaa-project,2012-09-12 21:55:02.184564
 
1124,193,test1234124890814,212,group/fork-aaa-project,"",user_created_fork:group/fork-aaa-project,2012-09-12 21:55:02.198242
 
1125,3,demo,36,bootstrap,"",user_updated_repo,2012-09-13 11:40:44.539269
 
1126,3,demo,36,bootstrap,"",user_updated_repo,2012-09-13 11:40:50.053297
 
1127,3,demo,34,a,"",user_commented_revision:48e1ba33b7951b8e8023e3e3cc54ef2540f4e8f1,2012-09-13 11:45:58.772773
 
1128,3,demo,213,fork-aii,"",started_following_repo,2012-09-13 11:47:05.531304
 
1129,3,demo,34,a,"",user_forked_repo:fork-aii,2012-09-13 11:47:05.549251
 
1130,3,demo,213,fork-aii,"",user_created_fork:fork-aii,2012-09-13 11:47:05.56141
 
1131,3,demo,214,group/fork-clojure.git2,"",started_following_repo,2012-09-13 11:49:07.655132
 
1132,3,demo,120,group/clojure.git,"",user_forked_repo:group/fork-clojure.git2,2012-09-13 11:49:09.06382
 
1133,3,demo,214,group/fork-clojure.git2,"",user_created_fork:group/fork-clojure.git2,2012-09-13 11:49:09.078581
 
1134,3,demo,34,a,"",push_local:f437e821a406d35b1e231c5a81e82853f8ed6436,2012-09-13 11:54:41.606977
 
1135,3,demo,34,a,"",user_commented_revision:f437e821a406d35b1e231c5a81e82853f8ed6436,2012-09-13 11:54:58.759518
 
1136,3,demo,215,fork-aaa-project-fork,"",started_following_repo,2012-09-13 13:38:46.509316
 
1137,3,demo,68,aaa-project,"",user_forked_repo:fork-aaa-project-fork,2012-09-13 13:38:46.527575
 
1138,3,demo,215,fork-aaa-project-fork,"",user_created_fork:fork-aaa-project-fork,2012-09-13 13:38:46.539228
 
1139,3,demo,215,fork-aaa-project-fork,"",push_local:7a8d3ab1f8ae1f1ab29a8b91b1946d92e30d46b3,2012-09-13 13:39:43.069005
 
1140,3,demo,68,aaa-project,"",stopped_following_repo,2012-09-13 15:29:12.016889
 
1141,3,demo,68,aaa-project,"",started_following_repo,2012-09-13 15:29:12.692509
 
1142,195,emcconne,216,TestingRhino,"",started_following_repo,2012-09-13 17:30:27.876656
 
1143,195,emcconne,216,TestingRhino,"",user_created_repo,2012-09-13 17:30:27.892609
 
1144,198,sdfsdf,217,sdfsdf,"",started_following_repo,2012-09-14 08:58:28.936153
 
1145,198,sdfsdf,217,sdfsdf,"",user_created_repo,2012-09-14 08:58:28.945587
 
1146,198,sdfsdf,217,sdfsdf,"",push_local:13d78aa20a388de51a7717800e6d3ce5d186bb19,2012-09-14 08:58:39.080817
 
1147,3,demo,218,TestRepo,"",started_following_repo,2012-09-14 11:07:12.582488
 
1148,3,demo,218,TestRepo,"",user_created_repo,2012-09-14 11:07:12.591173
 
1149,3,demo,68,aaa-project,"",user_commented_pull_request:50,2012-09-14 13:24:16.044125
 
1150,3,demo,68,aaa-project,"",user_commented_pull_request:50,2012-09-14 13:24:51.197813
 
1151,3,demo,68,aaa-project,"",user_closed_pull_request:50,2012-09-14 13:24:51.217266
 
1152,3,demo,68,aaa-project,"",user_updated_repo,2012-09-14 13:27:23.206802
 
1153,3,demo,34,a,"",user_commented_revision:f437e821a406d35b1e231c5a81e82853f8ed6436,2012-09-14 16:02:30.704441
 
1154,200,animusoft,219,Animusoft.Respository,"",started_following_repo,2012-09-14 18:02:30.536279
 
1155,200,animusoft,219,Animusoft.Respository,"",user_created_repo,2012-09-14 18:02:30.545377
 
1156,200,animusoft,219,Animusoft.Respository,"",push_local:73da86adad8bdb1ce83aa6a5d0c603a9b28b4a37,2012-09-14 18:04:26.459249
 
1157,200,animusoft,219,Animusoft.Respository,"",push_local:6b8fe7f9d13089ca20dddca163b35f7d8651f60f,2012-09-14 18:05:16.811723
 
1158,201,AsyA,220,TestTestTestTestTestTest,"",started_following_repo,2012-09-14 19:16:17.886851
 
1159,201,AsyA,220,TestTestTestTestTestTest,"",user_created_repo,2012-09-14 19:16:17.895972
 
1160,201,AsyA,220,TestTestTestTestTestTest,"",push_local:25acf78d91b645e98173440645ccfe14688b1f20,2012-09-14 19:17:19.578893
 
1161,201,AsyA,220,TestTestTestTestTestTest,"",push_local:f067475760e5739e2c9ada32160ff4d14193071b,2012-09-14 19:20:09.018005
 
1162,201,AsyA,220,TestTestTestTestTestTest,"",user_commented_revision:f067475760e5739e2c9ada32160ff4d14193071b,2012-09-14 19:20:26.225849
 
1163,201,AsyA,220,TestTestTestTestTestTest,"",user_commented_revision:f067475760e5739e2c9ada32160ff4d14193071b,2012-09-14 19:20:31.314463
 
1164,201,AsyA,220,TestTestTestTestTestTest,"",user_commented_revision:f067475760e5739e2c9ada32160ff4d14193071b,2012-09-14 19:20:36.071029
 
1165,201,AsyA,220,TestTestTestTestTestTest,"",user_commented_revision:f067475760e5739e2c9ada32160ff4d14193071b,2012-09-14 19:20:42.675126
 
1166,201,AsyA,220,TestTestTestTestTestTest,"",user_commented_revision:f067475760e5739e2c9ada32160ff4d14193071b,2012-09-14 19:20:45.57336
 
1167,201,AsyA,220,TestTestTestTestTestTest,"",user_commented_revision:f067475760e5739e2c9ada32160ff4d14193071b,2012-09-14 19:20:48.976628
 
1168,201,AsyA,221,fork-TestTestTestTestTestTest,"",started_following_repo,2012-09-14 19:26:54.224113
 
1169,201,AsyA,220,TestTestTestTestTestTest,"",user_forked_repo:fork-TestTestTestTestTestTest,2012-09-14 19:26:54.236074
 
1170,201,AsyA,221,fork-TestTestTestTestTestTest,"",user_created_fork:fork-TestTestTestTestTestTest,2012-09-14 19:26:54.243559
 
1171,201,AsyA,221,fork-TestTestTestTestTestTest,"",push_local:05e54fdd720c30f564ed12bdbff6dbbeb55f3816,2012-09-14 19:29:39.084466
 
1172,201,AsyA,220,TestTestTestTestTestTest,"",user_commented_pull_request:51,2012-09-14 19:36:31.399955
 
1173,201,AsyA,220,TestTestTestTestTestTest,"",user_closed_pull_request:51,2012-09-14 19:36:31.404011
 
1174,201,AsyA,220,TestTestTestTestTestTest,"",push_local:79f5d792cff0085cf103a76c7a19934de3828f43,2012-09-14 19:44:41.485916
 
1175,203,f.ludwig,222,florian-test,"",started_following_repo,2012-09-15 14:46:45.248996
 
1176,203,f.ludwig,222,florian-test,"",user_created_repo,2012-09-15 14:46:45.258481
 
1177,203,f.ludwig,223,florian-test-fork,"",started_following_repo,2012-09-15 14:47:01.375283
 
1178,203,f.ludwig,222,florian-test,"",user_forked_repo:florian-test-fork,2012-09-15 14:47:01.40721
 
1179,203,f.ludwig,223,florian-test-fork,"",user_created_fork:florian-test-fork,2012-09-15 14:47:01.415249
 
1180,203,f.ludwig,223,florian-test-fork,"",push_local:028186940dbf5db5818c2c0a9ff80f214da0fd3f,2012-09-15 15:20:01.863826
 
1181,203,f.ludwig,223,florian-test-fork,"",push_local:4225a7038b6d6bb193056967830ba56a2f38b005,2012-09-15 15:20:28.233187
 
1182,203,f.ludwig,223,florian-test-fork,"",user_commented_revision:4225a7038b6d6bb193056967830ba56a2f38b005,2012-09-15 15:20:38.339449
 
1183,203,f.ludwig,223,florian-test-fork,"",user_commented_revision:4225a7038b6d6bb193056967830ba56a2f38b005,2012-09-15 15:20:43.785366
 
1184,203,f.ludwig,223,florian-test-fork,"",user_commented_revision:4225a7038b6d6bb193056967830ba56a2f38b005,2012-09-15 15:21:21.2331
 
1185,193,test1234124890814,224,gnomon,"",started_following_repo,2012-09-15 22:29:06.869927
 
1186,193,test1234124890814,224,gnomon,"",user_created_repo,2012-09-15 22:29:06.906648
 
1187,207,D21,225,Some-fork,"",started_following_repo,2012-09-16 07:54:31.811337
 
1188,207,D21,99,another-fork-to-check-code-review,"",user_forked_repo:Some-fork,2012-09-16 07:54:31.928503
 
1189,207,D21,225,Some-fork,"",user_created_fork:Some-fork,2012-09-16 07:54:31.937372
 
1190,3,demo,68,aaa-project,"",stopped_following_repo,2012-09-17 02:37:55.405711
 
1191,3,demo,68,aaa-project,"",started_following_repo,2012-09-17 02:37:56.743644
 
1192,3,demo,32,big-project,"",push_local:90f0247f654982a4dbc9e4861418c595a683e955,2012-09-17 02:40:47.259763
 
1193,3,demo,32,big-project,"",user_commented_revision:90f0247f654982a4dbc9e4861418c595a683e955,2012-09-17 02:42:22.067682
 
1194,3,demo,32,big-project,"",user_commented_revision:90f0247f654982a4dbc9e4861418c595a683e955,2012-09-17 02:43:53.288729
 
1195,3,demo,32,big-project,"",user_commented_revision:90f0247f654982a4dbc9e4861418c595a683e955,2012-09-17 02:44:53.446591
 
1196,3,demo,32,big-project,"",user_commented_revision:90f0247f654982a4dbc9e4861418c595a683e955,2012-09-17 02:45:25.720276
 
1197,210,NewJoker,226,Game-Pomba,"",started_following_repo,2012-09-17 19:42:40.085447
 
1198,210,NewJoker,226,Game-Pomba,"",user_created_repo,2012-09-17 19:42:40.098774
 
1199,210,NewJoker,226,Game-Pomba,200.145.158.30,"push:82cbee64e8bf751654f39b6cef522575394d2b39,428505e2393b901562daac11bc050f449cb4418c,79c5e73e770d002472ee117b099b998b1897f140,67c5815cf9810a07a4edcfb63a6801a230149225",2012-09-17 19:43:52.544873
 
1200,210,NewJoker,226,Game-Pomba,"",user_updated_repo,2012-09-17 19:51:20.717504
 
1201,210,NewJoker,226,Game-Pomba,"",user_updated_repo,2012-09-17 19:54:17.369104
 
1202,211,hmcaio,226,Game-Pomba,200.145.158.30,pull,2012-09-17 20:06:05.58778
 
1203,108,dukeofgaming,124,fork-another-fork-to-check-code-review,"",user_updated_repo,2012-09-18 22:11:32.262653
 
1204,3,demo,227,fork-aaa-project-2,"",started_following_repo,2012-09-19 05:04:47.237996
 
1205,3,demo,68,aaa-project,"",user_forked_repo:fork-aaa-project-2,2012-09-19 05:04:47.261047
 
1206,3,demo,227,fork-aaa-project-2,"",user_created_fork:fork-aaa-project-2,2012-09-19 05:04:47.275211
 
1207,203,f.ludwig,223,florian-test-fork,"",user_commented_revision:028186940dbf5db5818c2c0a9ff80f214da0fd3f,2012-09-19 10:34:12.945275
 
1208,203,f.ludwig,223,florian-test-fork,"",user_commented_revision:028186940dbf5db5818c2c0a9ff80f214da0fd3f,2012-09-19 10:34:21.140947
 
1209,203,f.ludwig,223,florian-test-fork,"",user_commented_revision:028186940dbf5db5818c2c0a9ff80f214da0fd3f,2012-09-19 10:34:26.061929
 
1210,1,default,68,aaa-project,74.125.184.38,pull,2012-09-19 15:23:03.784613
 
1211,3,demo,68,aaa-project,74.125.184.23,push:8c632d9ca9fa402f585385c3bbadc139d6d085a9,2012-09-19 15:24:52.655487
 
1212,214,am385,228,Testbed101,"",started_following_repo,2012-09-19 20:56:01.838629
 
1213,214,am385,228,Testbed101,"",user_created_repo,2012-09-19 20:56:01.853795
 
1214,214,am385,228,Testbed101,"",push_local:20cfcd314a6eae3cc3f83ac57e3f3d0bfbd12bfa,2012-09-19 21:02:39.003808
 
1215,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-09-20 00:05:46.898686
 
1216,1,default,122,amab,64.0.193.29,pull,2012-09-20 08:28:43.327263
 
1217,3,demo,205,releases/fork-Sopra_testgd,"",user_commented_revision:99095f2d5703cbc43294ef55a19c5cc9e4cc2c15,2012-09-20 09:35:54.589279
 
1218,3,demo,205,releases/fork-Sopra_testgd,"",user_commented_revision:99095f2d5703cbc43294ef55a19c5cc9e4cc2c15,2012-09-20 09:37:33.380842
 
1219,3,demo,204,releases/Sopra_testgd,"",user_commented_pull_request:46,2012-09-20 09:38:40.617161
 
1220,3,demo,204,releases/Sopra_testgd,"",user_closed_pull_request:46,2012-09-20 09:38:40.624018
 
1221,3,demo,229,blaat,"",started_following_repo,2012-09-20 19:20:37.921692
 
1222,3,demo,229,blaat,"",user_created_repo,2012-09-20 19:20:37.930827
 
1223,3,demo,34,a,"",user_commented_revision:f437e821a406d35b1e231c5a81e82853f8ed6436,2012-09-20 20:07:29.000255
 
1224,3,demo,230,eks1,"",started_following_repo,2012-09-20 20:42:54.376374
 
1225,3,demo,230,eks1,"",user_created_repo,2012-09-20 20:42:54.385712
 
1226,3,demo,230,eks1,216.191.220.77,push:f58be25d36113902d50783abb44d7bcbc62e4eb7,2012-09-20 20:46:36.378744
 
1227,1,default,230,eks1,216.191.220.77,pull,2012-09-20 20:47:13.533037
 
1228,3,demo,230,eks1,216.191.220.77,push:cc064b1c1831e9b5b1db6b9c72a7404b111b579a,2012-09-20 20:47:42.815309
 
1229,1,default,230,eks1,216.191.220.77,pull,2012-09-20 20:47:53.706376
 
1230,1,default,230,eks1,216.191.220.77,pull,2012-09-20 20:47:58.020108
 
1231,3,demo,230,eks1,"",user_commented_revision:f58be25d36113902d50783abb44d7bcbc62e4eb7,2012-09-20 20:48:53.742614
 
1232,3,demo,230,eks1,"",user_commented_revision:cc064b1c1831e9b5b1db6b9c72a7404b111b579a,2012-09-20 20:49:30.403129
 
1233,3,demo,231,fork-eks1,"",started_following_repo,2012-09-20 20:51:24.23117
 
1234,3,demo,230,eks1,"",user_forked_repo:fork-eks1,2012-09-20 20:51:24.242627
 
1235,3,demo,231,fork-eks1,"",user_created_fork:fork-eks1,2012-09-20 20:51:24.249831
 
1236,1,default,231,fork-eks1,216.191.220.77,pull,2012-09-20 20:51:52.699176
 
1237,3,demo,231,fork-eks1,216.191.220.77,push:7be3eb971e236dd0c1d7b7c4637e7fab9c0a8eff,2012-09-20 20:52:17.107154
 
1238,3,demo,230,eks1,"",user_commented_pull_request:53,2012-09-20 20:57:09.709452
 
1239,3,demo,230,eks1,"",user_commented_pull_request:53,2012-09-20 20:59:58.813611
 
1240,3,demo,230,eks1,"",user_closed_pull_request:53,2012-09-20 20:59:58.820711
 
1241,3,demo,230,eks1,"",user_commented_pull_request:54,2012-09-20 21:02:22.161549
 
1242,3,demo,230,eks1,"",user_closed_pull_request:54,2012-09-20 21:02:22.167313
 
1243,1,default,231,fork-eks1,216.191.220.77,pull,2012-09-20 23:22:45.505072
 
1244,3,demo,230,eks1,216.191.220.77,push:7be3eb971e236dd0c1d7b7c4637e7fab9c0a8eff,2012-09-20 23:24:42.752414
 
1245,3,demo,231,fork-eks1,216.191.220.77,push:1a4b7771bd03e57d3a9854efd18de0d7d66db5d8,2012-09-20 23:25:49.109081
 
1246,216,eks,232,eks1-eksfork,"",started_following_repo,2012-09-20 23:33:21.433073
 
1247,216,eks,230,eks1,"",user_forked_repo:eks1-eksfork,2012-09-20 23:33:21.446723
 
1248,216,eks,232,eks1-eksfork,"",user_created_fork:eks1-eksfork,2012-09-20 23:33:21.453956
 
1249,1,default,232,eks1-eksfork,216.191.220.77,pull,2012-09-20 23:36:06.736653
 
1250,1,default,122,amab,176.9.28.203,pull,2012-09-21 01:56:49.09876
 
1251,3,demo,233,clonetest,"",started_following_repo,2012-09-21 01:56:49.309535
 
1252,3,demo,233,clonetest,"",user_created_repo,2012-09-21 01:56:49.327352
 
1253,217,domvign,234,fork2-tord,"",started_following_repo,2012-09-21 03:45:07.090078
 
1254,217,domvign,201,tord,"",user_forked_repo:fork2-tord,2012-09-21 03:45:07.111893
 
1255,217,domvign,234,fork2-tord,"",user_created_fork:fork2-tord,2012-09-21 03:45:07.125832
 
1256,3,demo,235,test_test1,"",started_following_repo,2012-09-21 08:25:55.301672
 
1257,3,demo,235,test_test1,"",user_created_repo,2012-09-21 08:25:55.312484
 
1258,3,demo,235,test_test1,"",push_local:49f5d4efef5c24a6c82f3f56c750f6bd29d7e65c,2012-09-21 08:27:48.618627
 
1259,3,demo,197,CollectionQuery,"",user_commented_revision:c51ad09cfdf5ae85a70c0210febc2692bdd0e0db,2012-09-21 10:14:32.510501
 
1260,218,akesterson,236,myfork-CollectionQuery,"",started_following_repo,2012-09-21 14:45:19.861126
 
1261,218,akesterson,197,CollectionQuery,"",user_forked_repo:myfork-CollectionQuery,2012-09-21 14:45:19.889428
 
1262,218,akesterson,236,myfork-CollectionQuery,"",user_created_fork:myfork-CollectionQuery,2012-09-21 14:45:19.903413
 
1263,218,akesterson,236,myfork-CollectionQuery,"",push_local:02029afb80de14455a4226a4a77b760b895aff7e,2012-09-21 14:46:12.771297
 
1264,218,akesterson,236,myfork-CollectionQuery,"",push_local:2def3b046d2221aba86f5c9f1adb7259725bc8f5,2012-09-21 14:46:37.060973
 
1265,218,akesterson,237,fork-myfork-CollectionQuery,"",started_following_repo,2012-09-21 14:48:05.149741
 
1266,218,akesterson,236,myfork-CollectionQuery,"",user_forked_repo:fork-myfork-CollectionQuery,2012-09-21 14:48:05.166032
 
1267,218,akesterson,237,fork-myfork-CollectionQuery,"",user_created_fork:fork-myfork-CollectionQuery,2012-09-21 14:48:05.176775
 
1268,218,akesterson,237,fork-myfork-CollectionQuery,"",push_local:2300a2cb9c42bf638a156fcbe8cebfed710bd8e6,2012-09-21 14:49:48.45509
 
1269,218,akesterson,236,myfork-CollectionQuery,"",user_commented_pull_request:57,2012-09-21 14:51:01.214716
 
1270,218,akesterson,236,myfork-CollectionQuery,"",user_commented_pull_request:58,2012-09-21 14:52:20.163131
 
1271,218,akesterson,236,myfork-CollectionQuery,"",user_closed_pull_request:58,2012-09-21 14:52:20.17166
 
1275,218,akesterson,237,fork-myfork-CollectionQuery,"",push_local:73fcef6d2abe2dc061da59086561c7854266a78c,2012-09-21 14:56:02.339532
 
1276,218,akesterson,238,fork2-myfork-CollectionQuery,"",started_following_repo,2012-09-21 15:11:55.391857
 
1277,218,akesterson,236,myfork-CollectionQuery,"",user_forked_repo:fork2-myfork-CollectionQuery,2012-09-21 15:11:55.415225
 
1278,218,akesterson,238,fork2-myfork-CollectionQuery,"",user_created_fork:fork2-myfork-CollectionQuery,2012-09-21 15:11:55.429075
 
1279,218,akesterson,238,fork2-myfork-CollectionQuery,"",push_local:c29afd42fdfc5ef1d786ba0575a72c6a7991887b,2012-09-21 15:12:20.646365
 
1280,218,akesterson,236,myfork-CollectionQuery,"",user_commented_pull_request:59,2012-09-21 15:13:11.024446
 
1281,218,akesterson,236,myfork-CollectionQuery,"",user_commented_pull_request:59,2012-09-21 15:14:21.074425
 
1282,218,akesterson,236,myfork-CollectionQuery,"",user_closed_pull_request:59,2012-09-21 15:14:21.083354
 
1283,27,test123,38,code-review-test,"",user_commented_revision:125ff5654b72009b251706d7ee93051853f066b6,2012-09-21 20:57:25.108349
 
1284,27,test123,38,code-review-test,"",user_commented_revision:125ff5654b72009b251706d7ee93051853f066b6,2012-09-21 20:58:03.041734
 
1285,3,demo,233,clonetest,"",user_commented_revision:8530d8e3eab04997ac4a2a5d8a8b54fa61bb9884,2012-09-23 15:45:55.650268
 
1286,3,demo,197,CollectionQuery,"",stopped_following_repo,2012-09-23 15:47:09.082723
 
1287,3,demo,197,CollectionQuery,"",started_following_repo,2012-09-23 15:47:10.981914
 
1288,3,demo,42,foo,"",user_updated_repo,2012-09-24 08:58:54.191524
 
1289,3,demo,1,test,"",user_commented_pull_request:60,2012-09-24 20:09:58.857304
 
1290,3,demo,239,w,"",started_following_repo,2012-09-25 05:06:46.054337
 
1291,3,demo,239,w,"",user_created_repo,2012-09-25 05:06:46.066475
 
1292,3,demo,240,superTest,"",started_following_repo,2012-09-25 05:07:49.733782
 
1293,3,demo,240,superTest,"",user_created_repo,2012-09-25 05:07:49.743076
 
1294,3,demo,34,a,"",user_updated_repo,2012-09-25 05:16:48.876018
 
1295,3,demo,241,fork-a2,"",started_following_repo,2012-09-25 10:40:13.278898
 
1296,3,demo,34,a,"",user_forked_repo:fork-a2,2012-09-25 10:40:13.299758
 
1297,3,demo,241,fork-a2,"",user_created_fork:fork-a2,2012-09-25 10:40:13.313299
 
1298,3,demo,241,fork-a2,"",push_local:7f7ca797917c69ae6cfdab99b428fe67aebd764d,2012-09-25 10:40:41.937706
 
1299,3,demo,34,a,"",user_commented_pull_request:61,2012-09-25 10:43:24.263815
 
1300,3,demo,34,a,"",user_closed_pull_request:61,2012-09-25 10:43:24.268374
 
1301,3,demo,242,testtest,"",started_following_repo,2012-09-25 19:58:30.104927
 
1302,3,demo,242,testtest,"",user_created_repo,2012-09-25 19:58:30.114632
 
1303,3,demo,242,testtest,50.76.185.37,"push:82cc04e644fb4ac2202d6d38c3f98e1ac583fbd9,0c51202e5f9ac63b0f54eb5229f1850b430c3186,e5b80b681b96b37265d212ff97f655ae97f920c9,bacfc2c685668fb52d13bf438086167929628a4e,19a96e811fcce0440161ac77fa28feb608edfbc6,5a35e5e9d69b0d84199ca2477f596e0684f1d632,643146ee8f6e0798c2a6a6fdbe4dce9eff7776f2,6a0c17c8020c04ab67e055d4c4aec03e29ca7ad6,978d9e35d3bb27a2ef3b2fec04a15492f1d61970,bc1cc5164ef4bad7bbdb17caf14894f92d5d111f,331d14ee58a0530c7fd3c41537b4d247ae9d9ad6,404df8cdf4d474f97420a830d01aee7fbd2ea776,e2930d41a1769be193c2605be14532f3cc2cc162,59ae718e69abd66a3014356bf876f66db2a874b8,96163b25ae03a682d0582d4033649ee58e0fccee,66bada0d3d62a4b4b92de4e3e8d4b02d765a7326,63c17351ec88d5628ba7a2ce01ff08d1f519d7e2,e2949eadc403df055a58c7e0892926e53c38f872,2faef02e93acd948fcce2279d6d6f81da7e3a301,5e919a6fd85fab8b90a8b62d00e463dfcc4d21b6,06ebdbdf1a1b41a7c050d52a022be408a1437951,d37662b26d07c70ad4b4732fac696a7e7fa9685c,e07b358c22daf4e8b45e4ab869c1137c2b7dd0d5,d82075dcdcec0739ddcad0bcb96b671f6a3d3c7b,6866e9be9fde15aaf2a8639a931410089275db45,977fa64f7f1bd526a04cbc701683e3b789221a9c,ca4d6af6c64afeb8d4589002421038314ead455a",2012-09-25 19:59:54.485036
 
1304,3,demo,34,a,"",push_local:98b22b6458fc028d5b8beb740d39372e72d8f41f,2012-09-25 21:22:16.676417
 
1305,3,demo,34,a,76.112.55.52,pull,2012-09-25 21:26:13.528081
 
1306,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-09-26 15:07:40.4856
 
1307,3,demo,243,SR3HF2,"",started_following_repo,2012-09-26 16:53:58.744798
 
1308,3,demo,243,SR3HF2,"",user_created_repo,2012-09-26 16:53:58.760782
 
1309,3,demo,243,SR3HF2,"",push_local:d9cf639344ea84f1a5c57f9ce10c043f1b446e08,2012-09-26 17:05:27.808045
 
1310,3,demo,243,SR3HF2,"",user_updated_repo,2012-09-26 17:10:30.366062
 
1311,3,demo,243,SR3HF2,"",user_updated_repo,2012-09-26 17:11:11.747863
 
1312,3,demo,243,SR3HF2,"",user_updated_repo,2012-09-26 17:11:48.355287
 
1313,230,AstrasyA,244,Sonny,"",started_following_repo,2012-09-26 17:43:33.022333
 
1314,230,AstrasyA,244,Sonny,"",user_created_repo,2012-09-26 17:43:33.033696
 
1315,230,AstrasyA,244,Sonny,"",push_local:9732b5c4fdde74545ca40878530e804712c4e445,2012-09-26 17:44:35.341457
 
1316,230,AstrasyA,244,Sonny,50.84.107.130,pull,2012-09-26 17:59:06.387257
 
1317,230,AstrasyA,244,Sonny,50.84.107.130,"push:98d933718544ec91d426b6b37f091f6f0501b3dc,334ac777d05f4653887569cb2b68ea7c255cf929",2012-09-26 18:27:38.08683
 
1318,230,AstrasyA,244,Sonny,50.84.107.130,push:57eaee8ade535415036f1e9fada104edd1db8389,2012-09-26 18:43:41.784818
 
1319,230,AstrasyA,244,Sonny,"",user_commented_revision:57eaee8ade535415036f1e9fada104edd1db8389,2012-09-26 19:34:58.000965
 
1320,230,AstrasyA,244,Sonny,"",user_commented_revision:57eaee8ade535415036f1e9fada104edd1db8389,2012-09-26 19:35:02.910074
 
1321,230,AstrasyA,244,Sonny,"",user_commented_revision:57eaee8ade535415036f1e9fada104edd1db8389,2012-09-26 19:35:13.500416
 
1322,230,AstrasyA,244,Sonny,"",user_commented_revision:57eaee8ade535415036f1e9fada104edd1db8389,2012-09-26 19:37:13.951346
 
1323,230,AstrasyA,244,Sonny,"",user_commented_revision:57eaee8ade535415036f1e9fada104edd1db8389,2012-09-26 19:37:19.504417
 
1324,3,demo,245,SubrepoTest,"",started_following_repo,2012-09-26 21:03:21.25341
 
1325,3,demo,245,SubrepoTest,"",user_created_repo,2012-09-26 21:03:21.266132
 
1326,3,demo,246,SubrepoTest-subrepo,"",started_following_repo,2012-09-26 21:04:08.921652
 
1327,3,demo,246,SubrepoTest-subrepo,"",user_created_repo,2012-09-26 21:04:08.935788
 
1328,230,AstrasyA,244,Sonny,50.84.107.130,"push:4d583f24f1984fd21a8038d60ae510cd8e0d5b8c,8543508ae6664832fe59cd4f6587add1b69c6db3",2012-09-26 22:49:33.613712
 
1329,230,AstrasyA,244,Sonny,"",user_commented_revision:4d583f24f1984fd21a8038d60ae510cd8e0d5b8c,2012-09-26 22:54:09.170876
 
1330,230,AstrasyA,244,Sonny,"",user_commented_revision:4d583f24f1984fd21a8038d60ae510cd8e0d5b8c,2012-09-26 22:54:21.612237
 
1331,1,default,159,group/Test-for-code-review,"",push_local:4471d93e69c9abb14c65ac96a349fd642269a337,2012-09-27 01:26:37.747241
 
1332,231,asdf,247,fork-a-fork1,"",started_following_repo,2012-09-27 02:13:08.518743
 
1333,231,asdf,90,a-fork1,"",user_forked_repo:fork-a-fork1,2012-09-27 02:13:08.536794
 
1334,231,asdf,247,fork-a-fork1,"",user_created_fork:fork-a-fork1,2012-09-27 02:13:08.54404
 
1335,3,demo,248,_KBTEST,"",started_following_repo,2012-09-27 06:39:50.386213
 
1336,3,demo,248,_KBTEST,"",user_created_repo,2012-09-27 06:39:50.395378
 
1337,232,demo123,249,abcdefg,"",started_following_repo,2012-09-27 09:46:45.351423
 
1338,232,demo123,127,my-super-rep,"",user_forked_repo:abcdefg,2012-09-27 09:46:45.389459
 
1339,232,demo123,249,abcdefg,"",user_created_fork:abcdefg,2012-09-27 09:46:45.396765
 
1340,232,demo123,249,abcdefg,"",push_local:ef6c825bc5699b95a31ae3075693b12693a623e2,2012-09-27 09:48:20.630491
 
1341,232,demo123,127,my-super-rep,"",user_commented_pull_request:62,2012-09-27 09:50:27.609218
 
1342,232,demo123,127,my-super-rep,"",user_commented_pull_request:62,2012-09-27 09:50:44.558277
 
1343,232,demo123,127,my-super-rep,"",user_commented_pull_request:62,2012-09-27 09:51:28.711229
 
1344,1,default,159,group/Test-for-code-review,"",push_local:f7383651e85c99e62e22e662b137790efa70660c,2012-09-27 11:10:12.51927
 
1345,233,mecoder,250,mecodertest,"",started_following_repo,2012-09-27 12:22:22.89884
 
1346,233,mecoder,250,mecodertest,"",user_created_repo,2012-09-27 12:22:22.907773
 
1347,77,test,251,test1234,"",started_following_repo,2012-09-27 14:22:54.649441
 
1348,77,test,251,test1234,"",user_created_repo,2012-09-27 14:22:54.658343
 
1349,1,default,86,qbtest,"",push_local:3875428f3bdcab3cfa74759a40182c6a643e4203,2012-09-27 14:49:57.797524
 
1350,3,demo,252,Test-repo,"",started_following_repo,2012-09-27 20:14:53.658366
 
1351,3,demo,252,Test-repo,"",user_created_repo,2012-09-27 20:14:53.667343
 
1352,3,demo,252,Test-repo,"",user_updated_repo,2012-09-27 20:16:25.412816
 
1353,235,wryfi,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-09-27 21:40:52.517897
 
1354,235,wryfi,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-09-27 21:41:45.427104
 
1355,1,default,86,qbtest,"",push_local:bed2107c6d7286a5645a27da26183fe6035e58ef,2012-09-28 01:02:08.90859
 
1356,1,default,68,aaa-project,24.237.22.151,pull,2012-09-28 02:40:56.789606
 
1357,1,default,68,aaa-project,24.237.22.151,pull,2012-09-28 02:41:08.302352
 
1358,1,default,159,group/Test-for-code-review,"",push_local:56533e7a81a9c1c68125dc45ac78c050791fd0a2,2012-09-28 10:06:43.559824
 
1359,2,admin,,"","",admin_created_user:ip,2012-09-28 22:22:59.371488
 
1360,2,admin,253,ip,"",started_following_repo,2012-09-28 22:23:19.263438
 
1361,2,admin,253,ip,"",admin_created_repo,2012-09-28 22:23:19.277556
 
1362,2,admin,253,ip,"",admin_updated_repo,2012-09-28 22:24:27.358795
 
1363,2,admin,253,ip,"",admin_updated_repo,2012-09-28 22:24:40.194254
 
1364,2,admin,253,ip,"",admin_updated_repo,2012-09-28 22:25:03.078491
 
1365,2,admin,253,ip,"",admin_updated_repo,2012-09-28 22:25:25.793178
 
1366,2,admin,253,ip,"",admin_updated_repo,2012-09-28 22:25:35.065161
 
1367,1,default,159,group/Test-for-code-review,"",push_local:6900b7e43c402939ee2d058b8ad94cce31cb6dcd,2012-09-29 00:17:35.860963
 
1368,1,default,86,qbtest,"",push_local:73eb33fa1edfc909f673d128bac55bd175aa7559,2012-09-29 02:34:11.898184
 
1369,3,demo,68,aaa-project,"",push_local:b4bf1f77b1288a24eb395537319b4f3155cffa71,2012-09-29 15:24:51.088586
 
1370,1,default,86,qbtest,"",push_local:f8647a38fa4e07d3a2dc96add8944581b31ebec5,2012-09-29 15:57:39.603006
 
1371,1,default,159,group/Test-for-code-review,"",push_local:b5c5b6f1112b43442d09a889212e132a93f5793d,2012-09-29 22:12:56.345343
 
1372,1,default,86,qbtest,"",push_local:bd704836ab78a54cfeb4819a781ff6371fad01bc,2012-09-30 14:33:42.755143
 
1373,244,dantascione,254,dantest,"",started_following_repo,2012-09-30 23:39:17.975735
 
1374,244,dantascione,254,dantest,"",user_created_repo,2012-09-30 23:39:17.98529
 
1375,245,charlouze,255,Testtest,"",started_following_repo,2012-10-01 11:19:43.687453
 
1376,245,charlouze,255,Testtest,"",user_created_repo,2012-10-01 11:19:43.696384
 
1377,245,charlouze,255,Testtest,"",push_local:ac7c39aa78a1d0c799881d699d8565b0816cc178,2012-10-01 11:20:31.326931
 
1378,245,charlouze,255,Testtest,"",user_commented_revision:ac7c39aa78a1d0c799881d699d8565b0816cc178,2012-10-01 11:23:58.997838
 
1379,245,charlouze,255,Testtest,"",user_commented_revision:ac7c39aa78a1d0c799881d699d8565b0816cc178,2012-10-01 11:24:31.208917
 
1380,245,charlouze,255,Testtest,"",user_commented_revision:ac7c39aa78a1d0c799881d699d8565b0816cc178,2012-10-01 11:26:15.205171
 
1381,245,charlouze,255,Testtest,"",user_commented_revision:ac7c39aa78a1d0c799881d699d8565b0816cc178,2012-10-01 11:28:48.152422
 
1382,5,natosha.bard,256,unity-test-trunk,"",started_following_repo,2012-10-01 12:54:48.012856
 
1383,5,natosha.bard,256,unity-test-trunk,"",user_created_repo,2012-10-01 12:54:48.021667
 
1384,5,natosha.bard,256,unity-test-trunk,62.116.219.97,push:5dfe4faa4f9adf73694cf8bb5d35ef0accc5d8b5,2012-10-01 12:57:11.503947
 
1385,5,natosha.bard,257,fork-unity-test-trunk,"",started_following_repo,2012-10-01 12:57:33.430298
 
1386,5,natosha.bard,256,unity-test-trunk,"",user_forked_repo:fork-unity-test-trunk,2012-10-01 12:57:33.441529
 
1387,5,natosha.bard,257,fork-unity-test-trunk,"",user_created_fork:fork-unity-test-trunk,2012-10-01 12:57:33.448865
 
1388,5,natosha.bard,256,unity-test-trunk,"",user_commented_revision:5dfe4faa4f9adf73694cf8bb5d35ef0accc5d8b5,2012-10-01 12:58:09.430931
 
1389,5,natosha.bard,258,fork-unity-test-trunk2,"",started_following_repo,2012-10-01 12:58:19.082884
 
1390,5,natosha.bard,256,unity-test-trunk,"",user_forked_repo:fork-unity-test-trunk2,2012-10-01 12:58:19.095714
 
1391,5,natosha.bard,258,fork-unity-test-trunk2,"",user_created_fork:fork-unity-test-trunk2,2012-10-01 12:58:19.103935
 
1392,5,natosha.bard,257,fork-unity-test-trunk,62.116.219.97,push:591581862d50c7439243a7ef92d7638a5c88e6be,2012-10-01 12:59:48.814795
 
1393,5,natosha.bard,257,fork-unity-test-trunk,"",user_commented_revision:591581862d50c7439243a7ef92d7638a5c88e6be,2012-10-01 13:00:18.872593
 
1394,5,natosha.bard,259,fork-fork-unity-test-trunk,"",started_following_repo,2012-10-01 13:00:29.763296
 
1395,5,natosha.bard,257,fork-unity-test-trunk,"",user_forked_repo:fork-fork-unity-test-trunk,2012-10-01 13:00:29.774818
 
1396,5,natosha.bard,259,fork-fork-unity-test-trunk,"",user_created_fork:fork-fork-unity-test-trunk,2012-10-01 13:00:29.782337
 
1397,1,default,259,fork-fork-unity-test-trunk,62.116.219.97,pull,2012-10-01 13:00:44.100787
 
1398,5,natosha.bard,259,fork-fork-unity-test-trunk,62.116.219.97,push:2d2486009a875d8d98667aef38451560fe93e763,2012-10-01 13:01:55.725508
 
1399,5,natosha.bard,260,fork-code-review-test2,"",started_following_repo,2012-10-01 14:08:47.077755
 
1400,5,natosha.bard,38,code-review-test,"",user_forked_repo:fork-code-review-test2,2012-10-01 14:08:47.376389
 
1401,5,natosha.bard,260,fork-code-review-test2,"",user_created_fork:fork-code-review-test2,2012-10-01 14:08:47.383934
 
1402,1,default,260,fork-code-review-test2,62.116.219.97,pull,2012-10-01 14:09:42.365103
 
1405,3,demo,261,subrepotest,"",started_following_repo,2012-10-02 10:44:47.066589
 
1406,3,demo,261,subrepotest,"",user_created_repo,2012-10-02 10:44:47.075524
 
1407,3,demo,262,subrepotest-subrepo,"",started_following_repo,2012-10-02 10:45:45.448349
 
1408,3,demo,262,subrepotest-subrepo,"",user_created_repo,2012-10-02 10:45:45.457209
 
1409,1,default,68,aaa-project,64.208.49.214,pull,2012-10-02 10:58:33.566475
 
1410,3,demo,68,aaa-project,64.208.49.214,push:0c33fa58efc5a5541d8d3f1a3d3b77367e3d94f5,2012-10-02 10:59:53.3117
 
1411,3,demo,263,ronka,"",started_following_repo,2012-10-02 20:07:51.923475
 
1412,3,demo,263,ronka,"",user_created_repo,2012-10-02 20:07:51.935377
 
1413,3,demo,263,ronka,"",push_local:1f91226c774447604a289d0bed9e05f83432fcbe,2012-10-02 20:08:15.849135
 
1414,3,demo,264,fork-ronka,"",started_following_repo,2012-10-02 20:10:09.612131
 
1415,3,demo,263,ronka,"",user_forked_repo:fork-ronka,2012-10-02 20:10:09.633433
 
1416,3,demo,264,fork-ronka,"",user_created_fork:fork-ronka,2012-10-02 20:10:09.647288
 
1417,3,demo,264,fork-ronka,"",push_local:4459658481bad662eb53b308fcf2c0f08fc03d9d,2012-10-02 20:11:23.190731
 
1418,3,demo,263,ronka,"",user_commented_pull_request:64,2012-10-02 20:12:47.073638
 
1419,3,demo,263,ronka,"",user_closed_pull_request:64,2012-10-02 20:12:47.080999
 
1420,3,demo,263,ronka,"",user_commented_revision:1f91226c774447604a289d0bed9e05f83432fcbe,2012-10-02 20:17:57.594034
 
1421,3,demo,110,django,"",user_commented_revision:129f1ac8484d63c2e61a44fb2a18dd17246c1c4d,2012-10-03 08:51:36.810037
 
1422,3,demo,110,django,"",user_commented_revision:129f1ac8484d63c2e61a44fb2a18dd17246c1c4d,2012-10-03 08:52:06.456456
 
1423,3,demo,127,my-super-rep,"",push_local:a43642a9b5a96ede38c20f64fc58827a8f20e276,2012-10-03 17:18:49.819491
 
1424,5,natosha.bard,265,mercurial-trunk,"",started_following_repo,2012-10-04 11:41:46.868234
 
1425,5,natosha.bard,265,mercurial-trunk,"",user_created_repo,2012-10-04 11:41:46.878607
 
1427,5,natosha.bard,266,fork-mercurial-trunk,"",started_following_repo,2012-10-04 11:44:29.692682
 
1428,5,natosha.bard,265,mercurial-trunk,"",user_forked_repo:fork-mercurial-trunk,2012-10-04 11:44:29.748996
 
1429,5,natosha.bard,266,fork-mercurial-trunk,"",user_created_fork:fork-mercurial-trunk,2012-10-04 11:44:29.756625
 
1431,246,stilvoid,267,fork-florian-test,"",started_following_repo,2012-10-04 11:54:18.90186
 
1432,246,stilvoid,222,florian-test,"",user_forked_repo:fork-florian-test,2012-10-04 11:54:18.931691
 
1433,246,stilvoid,267,fork-florian-test,"",user_created_fork:fork-florian-test,2012-10-04 11:54:18.939443
 
1434,5,natosha.bard,266,fork-mercurial-trunk,62.116.219.97,push:f11d82b04ca50abb59ad6cfbb16fbd5022f45395,2012-10-04 12:54:36.544979
 
1435,3,demo,268,foofootest,"",started_following_repo,2012-10-04 16:59:07.216586
 
1436,3,demo,268,foofootest,"",user_created_repo,2012-10-04 16:59:07.226019
 
1437,3,demo,268,foofootest,"unknown, 217.91.236.41",push:4bc0645c20363db85c9a5050a85c2c05a1991765,2012-10-04 16:59:59.645044
 
1438,3,demo,269,fork-foofootest,"",started_following_repo,2012-10-04 17:00:11.539125
 
1439,3,demo,268,foofootest,"",user_forked_repo:fork-foofootest,2012-10-04 17:00:11.631359
 
1440,3,demo,269,fork-foofootest,"",user_created_fork:fork-foofootest,2012-10-04 17:00:11.639325
 
1442,3,demo,270,fork-fork-code-review-test2-fork,"",started_following_repo,2012-10-04 20:42:33.068317
 
1443,3,demo,260,fork-code-review-test2,"",user_forked_repo:fork-fork-code-review-test2-fork,2012-10-04 20:42:33.16905
 
1444,3,demo,270,fork-fork-code-review-test2-fork,"",user_created_fork:fork-fork-code-review-test2-fork,2012-10-04 20:42:33.176787
 
1445,1,default,68,aaa-project,77.120.252.31,pull,2012-10-05 13:46:02.97144
 
1446,3,demo,271,ttt,"",started_following_repo,2012-10-05 14:18:30.594537
 
1447,3,demo,271,ttt,"",user_created_repo,2012-10-05 14:18:30.637003
 
1448,3,demo,272,tttt,"",started_following_repo,2012-10-05 14:19:42.35258
 
1449,3,demo,272,tttt,"",user_created_repo,2012-10-05 14:19:42.364131
 
1450,3,demo,273,dotemacs,"",started_following_repo,2012-10-06 06:10:59.614385
 
1451,3,demo,273,dotemacs,"",user_created_repo,2012-10-06 06:10:59.624083
 
1452,3,demo,273,dotemacs,202.120.38.18,push:9d237512de694be7b30e61b9e0373f0dc373fa24,2012-10-06 06:13:30.793795
 
1453,249,shahin,274,kado,"",started_following_repo,2012-10-07 13:13:08.693172
 
1454,249,shahin,274,kado,"",user_created_repo,2012-10-07 13:13:08.703331
 
1455,249,shahin,274,kado,"",push_local:cb452956879bd22220e2513d7417d239e216813d,2012-10-07 13:14:26.479362
 
1456,3,demo,275,TEST,"",started_following_repo,2012-10-07 22:32:01.007959
 
1457,3,demo,275,TEST,"",user_created_repo,2012-10-07 22:32:01.017119
 
1458,3,demo,276,my-wonderful-project,"",started_following_repo,2012-10-08 10:12:31.462976
 
1459,3,demo,276,my-wonderful-project,"",user_created_repo,2012-10-08 10:12:31.474657
 
1460,250,dessp,277,fork-fork-aaa-project,"",started_following_repo,2012-10-08 12:34:18.364871
 
1461,250,dessp,184,fork-aaa-project,"",user_forked_repo:fork-fork-aaa-project,2012-10-08 12:34:18.383393
 
1462,250,dessp,277,fork-fork-aaa-project,"",user_created_fork:fork-fork-aaa-project,2012-10-08 12:34:18.392037
 
1463,250,dessp,278,bla,"",started_following_repo,2012-10-08 12:35:59.034211
 
1464,250,dessp,278,bla,"",user_created_repo,2012-10-08 12:35:59.046964
 
1465,250,dessp,278,bla,"",push_local:d67d6b2cd83c926cc98b7338dd375c0d7dc224ed,2012-10-08 12:36:23.610968
 
1466,251,vaueff,279,meinsisses,"",started_following_repo,2012-10-08 17:11:28.309493
 
1467,251,vaueff,206,test-sls,"",user_forked_repo:meinsisses,2012-10-08 17:11:28.333732
 
1468,251,vaueff,279,meinsisses,"",user_created_fork:meinsisses,2012-10-08 17:11:28.34374
 
1469,3,demo,280,HelloWorld,"",started_following_repo,2012-10-08 17:19:57.672859
 
1470,3,demo,280,HelloWorld,"",user_created_repo,2012-10-08 17:19:57.685128
 
1471,3,demo,127,my-super-rep,"",user_commented_pull_request:62,2012-10-08 17:37:04.554118
 
1472,3,demo,127,my-super-rep,"",user_closed_pull_request:62,2012-10-08 17:37:04.56515
 
1473,3,demo,249,abcdefg,"",user_commented_revision:ef6c825bc5699b95a31ae3075693b12693a623e2,2012-10-08 17:38:13.042926
 
1474,254,yujiro,281,yujirotest,"",started_following_repo,2012-10-09 06:59:18.412429
 
1475,254,yujiro,281,yujirotest,"",user_created_repo,2012-10-09 06:59:18.424128
 
1476,254,yujiro,282,fork-amabあああ,"",started_following_repo,2012-10-09 07:03:34.289292
 
1477,254,yujiro,122,amab,"",user_forked_repo:fork-amabあああ,2012-10-09 07:03:34.308792
 
1478,254,yujiro,282,fork-amabあああ,"",user_created_fork:fork-amabあああ,2012-10-09 07:03:34.320104
 
1479,254,yujiro,172,go,"",started_following_repo,2012-10-09 07:09:23.727527
 
1480,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-10-09 08:44:14.777602
 
1481,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-10-09 08:44:52.916854
 
1482,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-10-09 08:45:16.42599
 
1483,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-10-09 08:45:38.745859
 
1484,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-10-09 08:45:52.328248
 
1485,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:30853f4bde2f2b6f0a7126392b9b1b4c5ea37e0a,2012-10-09 08:46:01.737145
 
1486,255,che,283,test-zh-tw,"",started_following_repo,2012-10-09 10:33:51.971598
 
1487,255,che,283,test-zh-tw,"",user_created_repo,2012-10-09 10:33:51.983333
 
1488,255,che,283,test-zh-tw,"61.56.13.120, 61.56.15.166","push:ea3aa785b5f361e36ccdbb8201fa809cf0e9b371,bf62637068b19308263d2ed9cdd1b43ae3d88757",2012-10-09 10:36:13.255622
 
1489,3,demo,284,fork-django,"",started_following_repo,2012-10-09 20:17:50.071294
 
1490,3,demo,110,django,"",user_forked_repo:fork-django,2012-10-09 20:17:57.420156
 
1491,3,demo,284,fork-django,"",user_created_fork:fork-django,2012-10-09 20:17:57.434345
 
1492,3,demo,285,github-killer,"",started_following_repo,2012-10-09 21:05:48.6309
 
1493,3,demo,285,github-killer,"",user_created_repo,2012-10-09 21:05:48.644556
 
1494,3,demo,285,github-killer,188.25.172.123,push:df73f912eb7cd583d1fda6a4ef19c1ab1dbc6f92,2012-10-09 21:06:55.345622
 
1495,3,demo,285,aloha,"",user_updated_repo,2012-10-09 21:13:16.792012
 
1496,3,demo,127,my-super-rep,"",user_commented_revision:5d80e28538141e322b317168e2367fb03178d58c,2012-10-09 22:39:42.201647
 
1497,3,demo,286,http-mercurial.selenic.com-hg,"",started_following_repo,2012-10-10 02:37:22.675764
 
1498,3,demo,286,http-mercurial.selenic.com-hg,"",user_created_repo,2012-10-10 02:37:22.693066
 
1499,3,demo,287,fork-http-mercurial.selenic.com-hg,"",started_following_repo,2012-10-10 02:38:04.918464
 
1500,3,demo,286,http-mercurial.selenic.com-hg,"",user_forked_repo:fork-http-mercurial.selenic.com-hg,2012-10-10 02:38:05.085956
 
1501,3,demo,287,fork-http-mercurial.selenic.com-hg,"",user_created_fork:fork-http-mercurial.selenic.com-hg,2012-10-10 02:38:05.094152
 
1502,3,demo,287,fork-http-mercurial.selenic.com-hg,"",push_local:9ce0ab91b57ea15f5e8569ef7304ce58c9acf477,2012-10-10 02:39:19.103663
 
1503,3,demo,286,http-mercurial.selenic.com-hg,"",user_commented_pull_request:66,2012-10-10 02:42:42.025549
 
1504,3,demo,286,http-mercurial.selenic.com-hg,"",user_closed_pull_request:66,2012-10-10 02:42:42.034609
 
1505,3,demo,287,fork-http-mercurial.selenic.com-hg,"",user_commented_revision:9ce0ab91b57ea15f5e8569ef7304ce58c9acf477,2012-10-10 02:44:45.999905
 
1506,3,demo,287,fork-http-mercurial.selenic.com-hg,"",user_commented_revision:9ce0ab91b57ea15f5e8569ef7304ce58c9acf477,2012-10-10 02:44:51.716813
 
1507,256,dg_test,288,dgtestrepo,"",started_following_repo,2012-10-10 04:48:48.801476
 
1508,256,dg_test,288,dgtestrepo,"",user_created_repo,2012-10-10 04:48:48.813822
 
1509,256,dg_test,288,dgtestrepo,59.167.167.230,push:27ab7e76abe80344db6a250d3a8979117907704a,2012-10-10 04:49:46.01297
 
1510,256,dg_test,289,fork-dgtestrepo,"",started_following_repo,2012-10-10 04:50:15.108071
 
1511,256,dg_test,288,dgtestrepo,"",user_forked_repo:fork-dgtestrepo,2012-10-10 04:50:15.127777
 
1512,256,dg_test,289,fork-dgtestrepo,"",user_created_fork:fork-dgtestrepo,2012-10-10 04:50:15.141651
 
1513,1,default,289,fork-dgtestrepo,59.167.167.230,pull,2012-10-10 04:50:29.22472
 
1514,256,dg_test,289,fork-dgtestrepo,59.167.167.230,push:36da9693f7e90974c46bf83c9abdb4803fac13ff,2012-10-10 04:50:59.757989
 
1515,256,dg_test,288,dgtestrepo,"",user_commented_pull_request:67,2012-10-10 04:51:51.635244
 
1516,256,dg_test,288,dgtestrepo,"",user_commented_pull_request:67,2012-10-10 04:52:13.711421
 
1517,256,dg_test,288,dgtestrepo,"",user_commented_pull_request:67,2012-10-10 04:54:11.518751
 
1518,256,dg_test,288,dgtestrepo,"",user_commented_pull_request:67,2012-10-10 06:35:30.952227
 
1519,1,default,289,fork-dgtestrepo,59.167.167.230,pull,2012-10-10 12:39:46.774029
 
1520,256,dg_test,288,dgtestrepo,59.167.167.230,push:36da9693f7e90974c46bf83c9abdb4803fac13ff,2012-10-10 12:40:26.181044
 
1521,256,dg_test,288,dgtestrepo,"",user_commented_pull_request:67,2012-10-10 12:41:54.987689
 
1522,256,dg_test,288,dgtestrepo,"",user_commented_pull_request:67,2012-10-10 12:42:03.057669
 
1523,256,dg_test,257,fork-unity-test-trunk,"",user_commented_pull_request:63,2012-10-10 12:47:14.298864
 
1524,256,dg_test,288,dgtestrepo,"",user_commented_revision:36da9693f7e90974c46bf83c9abdb4803fac13ff,2012-10-10 12:49:30.180636
 
1525,256,dg_test,288,dgtestrepo,"",user_commented_pull_request:67,2012-10-10 12:50:11.880937
 
1526,256,dg_test,288,dgtestrepo,"",user_closed_pull_request:67,2012-10-10 12:50:11.885641
 
1527,256,dg_test,290,dg1,"",started_following_repo,2012-10-10 13:00:18.072553
 
1528,256,dg_test,290,dg1,"",user_created_repo,2012-10-10 13:00:18.084695
 
1529,256,dg_test,291,fork-dg1,"",started_following_repo,2012-10-10 13:00:31.045836
 
1530,256,dg_test,290,dg1,"",user_forked_repo:fork-dg1,2012-10-10 13:00:31.064079
 
1531,256,dg_test,291,fork-dg1,"",user_created_fork:fork-dg1,2012-10-10 13:00:31.073556
 
1538,256,dg_test,290,dg1,"",user_commented_pull_request:68,2012-10-10 13:04:05.221925
 
1532,256,dg_test,290,dg1,59.167.167.230,push:c8996239abf9263cdee5b15234372e3a6e793e44,2012-10-10 13:01:40.777662
 
1533,256,dg_test,292,fork-dg11,"",started_following_repo,2012-10-10 13:02:33.177064
 
1534,256,dg_test,290,dg1,"",user_forked_repo:fork-dg11,2012-10-10 13:02:33.193349
 
1535,256,dg_test,292,fork-dg11,"",user_created_fork:fork-dg11,2012-10-10 13:02:33.207706
 
1536,1,default,292,fork-dg11,59.167.167.230,pull,2012-10-10 13:02:44.944887
 
1537,256,dg_test,292,fork-dg11,59.167.167.230,push:667a6c5db8f25896ef1cadd1f5138898026f068e,2012-10-10 13:03:21.048735
 
1540,256,dg_test,290,dg1,59.167.167.230,push:667a6c5db8f25896ef1cadd1f5138898026f068e,2012-10-10 13:04:47.505397
 
1541,256,dg_test,290,dg1,"",user_commented_revision:667a6c5db8f25896ef1cadd1f5138898026f068e,2012-10-10 13:09:03.381076
 
1539,256,dg_test,290,dg1,"",user_closed_pull_request:68,2012-10-10 13:04:05.229068
 
1542,256,dg_test,288,dgtestrepo,"",user_commented_revision:36da9693f7e90974c46bf83c9abdb4803fac13ff,2012-10-10 13:20:40.664276
 
1543,3,demo,38,code-review-test,"",user_commented_revision:6d7db5794e8cad7da042b6ae6238116c6e59a4d2,2012-10-10 21:33:13.589618
 
1544,1,default,122,amab,75.128.117.162,pull,2012-10-11 04:26:13.01088
 
1545,3,demo,294,fork-aloha,"",started_following_repo,2012-10-11 10:49:27.293629
 
1546,3,demo,285,aloha,"",user_forked_repo:fork-aloha,2012-10-11 10:49:27.403491
 
1547,3,demo,294,fork-aloha,"",user_created_fork:fork-aloha,2012-10-11 10:49:27.417952
 
1548,2,admin,,"","",admin_created_user:user_rc_1,2012-10-11 12:16:48.505211
 
1549,2,admin,,"","",admin_created_user:user_rc_2,2012-10-11 12:17:03.054922
 
1550,3,demo,34,a,"",user_commented_revision:f437e821a406d35b1e231c5a81e82853f8ed6436,2012-10-11 12:17:37.00837
 
1551,3,demo,34,a,"",user_commented_revision:f437e821a406d35b1e231c5a81e82853f8ed6436,2012-10-11 12:17:46.881784
 
1552,3,demo,34,a,"",user_commented_revision:f437e821a406d35b1e231c5a81e82853f8ed6436,2012-10-11 12:23:44.417665
 
1553,3,demo,122,amab,"",push_local:796c02c902e1098268c622e34e9526b7424c2f0a,2012-10-11 14:24:20.208902
 
1554,3,demo,295,test333,"",started_following_repo,2012-10-11 14:33:32.412381
 
1555,3,demo,295,test333,"",user_created_repo,2012-10-11 14:33:32.424562
 
1556,3,demo,285,aloha,"",push_local:b59aa4775f36a3f553d2d9b9296b9272106b920d,2012-10-11 14:34:31.082462
 
1557,3,demo,295,test333,62.153.70.3,"push:ee67bac620f0c1823f863be9e829efd5e3b34f42,a3c1ca826d1cc57132141e70ee7e9f77ecef43fe",2012-10-11 14:36:48.814768
 
1558,3,demo,285,aloha,"",push_local:3266a55348986338e8cffb2b8605ba754a54497f,2012-10-11 14:37:57.513628
 
1559,3,demo,285,aloha,"",push_local:8411bc8656efd477e0c817ebbbf448fe5ca0d5fa,2012-10-11 14:38:33.492779
 
1560,3,demo,285,aloha,"",user_updated_repo,2012-10-11 14:43:08.034646
 
1561,3,demo,285,aloha,"",user_updated_repo,2012-10-11 14:43:52.370534
 
1562,260,kudtest,296,fork-amab-kud,"",started_following_repo,2012-10-11 15:02:21.701772
 
1563,260,kudtest,122,amab,"",user_forked_repo:fork-amab-kud,2012-10-11 15:02:21.721067
 
1564,260,kudtest,296,fork-amab-kud,"",user_created_fork:fork-amab-kud,2012-10-11 15:02:21.738079
 
1565,3,demo,297,mytest,"",started_following_repo,2012-10-11 17:35:37.595048
 
1566,3,demo,297,mytest,"",user_created_repo,2012-10-11 17:35:37.607661
 
1567,3,demo,297,mytest,"",push_local:e9c241d5215f8bdfa8b0cabab229952b2740ee98,2012-10-11 17:37:50.954858
 
1568,3,demo,297,mytest,"",user_updated_repo,2012-10-11 17:39:13.548988
 
1569,37,tester,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-10-11 19:10:15.328087
 
1570,37,tester,201,tord,"",user_commented_revision:35b3ebc8e1c23902eb97031f42f666df0835c5be,2012-10-11 19:19:55.616125
 
1571,37,tester,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-10-11 19:24:45.086999
 
1572,37,tester,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-10-11 19:25:23.183406
 
1573,3,demo,43,bar,78.62.141.189,"push:cda1756acf28cae40e103db3792e4ac92c68d65a,3eab1e3601763da599d27541408fca1e12a09b02",2012-10-11 21:35:28.229244
 
1574,3,demo,298,a-foo,"",started_following_repo,2012-10-12 15:29:23.1832
 
1575,3,demo,298,a-foo,"",user_created_repo,2012-10-12 15:29:23.195979
 
1576,3,demo,298,a-foo,"",stopped_following_repo,2012-10-12 15:30:16.975594
 
1577,3,demo,298,a-foo,"",started_following_repo,2012-10-12 15:30:19.49313
 
1578,3,demo,285,aloha,"",user_commented_revision:8411bc8656efd477e0c817ebbbf448fe5ca0d5fa,2012-10-12 16:04:13.119321
 
1579,3,demo,299,test12345,"",started_following_repo,2012-10-13 02:45:09.148642
 
1580,3,demo,299,test12345,"",user_created_repo,2012-10-13 02:45:09.15792
 
1581,3,demo,300,TestTest,"",started_following_repo,2012-10-13 21:11:45.72971
 
1582,3,demo,300,TestTest,"",user_created_repo,2012-10-13 21:11:45.738999
 
1583,1,default,68,aaa-project,213.197.188.148,pull,2012-10-15 08:27:45.007378
 
1584,3,demo,301,fork-glib,"",started_following_repo,2012-10-16 08:31:44.802094
 
1585,3,demo,54,glib,"",user_forked_repo:fork-glib,2012-10-16 08:31:51.952999
 
1586,3,demo,301,fork-glib,"",user_created_fork:fork-glib,2012-10-16 08:31:51.967931
 
1587,3,demo,285,aloha,78.29.10.71,push:c7feb9671fc451e40758b9ed10496d854ba18a40,2012-10-16 08:34:12.115912
 
1588,270,raoul1,302,TestRaoul,"",started_following_repo,2012-10-16 09:24:57.710057
 
1589,270,raoul1,302,TestRaoul,"",user_created_repo,2012-10-16 09:24:57.725416
 
1590,270,raoul1,302,TestRaoul,"",user_updated_repo,2012-10-16 09:25:13.334125
 
1591,270,raoul1,302,TestRaoul,"",user_updated_repo,2012-10-16 09:27:33.159359
 
1592,271,raoul2,302,TestRaoul,"",user_updated_repo,2012-10-16 09:30:24.581076
 
1593,3,demo,68,aaa-project,"",user_commented_revision:0c33fa58efc5a5541d8d3f1a3d3b77367e3d94f5,2012-10-16 10:14:32.596831
 
1594,272,jamesc,303,Magical-Cheese-Repo,"",started_following_repo,2012-10-16 12:10:35.216711
 
1595,272,jamesc,303,Magical-Cheese-Repo,"",user_created_repo,2012-10-16 12:10:35.231231
 
1596,272,jamesc,304,Cheese-Fork,"",started_following_repo,2012-10-16 12:11:16.231228
 
1597,272,jamesc,303,Magical-Cheese-Repo,"",user_forked_repo:Cheese-Fork,2012-10-16 12:11:16.248472
 
1598,272,jamesc,304,Cheese-Fork,"",user_created_fork:Cheese-Fork,2012-10-16 12:11:16.2598
 
1599,272,jamesc,304,Cheese-Fork,"",push_local:47c7945748501f71737af1e83f5036cd17bde506,2012-10-16 12:13:20.106608
 
1600,3,demo,,sproject,"",started_following_repo,2012-10-16 14:07:45.531949
 
1601,3,demo,,sproject,"",user_created_repo,2012-10-16 14:07:45.550972
 
1602,3,demo,,sproject,"",user_deleted_repo,2012-10-16 14:12:00.222929
 
1603,3,demo,35,fork-Something22,"",user_updated_repo,2012-10-16 14:16:04.092997
 
1604,3,demo,306,testflow,"",started_following_repo,2012-10-16 18:58:10.988582
 
1605,3,demo,306,testflow,"",user_created_repo,2012-10-16 18:58:11.002092
 
1665,3,demo,268,foofootest,"",user_updated_repo,2012-10-17 20:41:34.07778
 
1666,1,default,266,fork-mercurial-trunk,78.53.4.31,pull,2012-10-18 00:34:23.822311
 
1667,1,default,265,mercurial-trunk,78.53.4.31,pull,2012-10-18 00:35:14.549948
 
1668,3,demo,34,a,"",push_local:a778c8853f594759661bf6e8fa9933dbd0c06390,2012-10-18 06:49:15.999219
 
1669,3,demo,314,Test123654,"",started_following_repo,2012-10-18 09:13:40.498593
 
1670,3,demo,314,Test123654,"",user_created_repo,2012-10-18 09:13:40.514075
 
1671,3,demo,315,fork-a-foo,"",started_following_repo,2012-10-18 10:55:34.287082
 
1672,3,demo,298,a-foo,"",user_forked_repo:fork-a-foo,2012-10-18 10:55:34.304187
 
1673,3,demo,315,fork-a-foo,"",user_created_fork:fork-a-foo,2012-10-18 10:55:34.313058
 
1674,279,sugia,316,Llskdjfsldkfjl,"",started_following_repo,2012-10-19 08:20:45.345545
 
1675,279,sugia,316,Llskdjfsldkfjl,"",user_created_repo,2012-10-19 08:20:45.355759
 
1676,279,sugia,316,Llskdjfsldkfjl,"",user_updated_repo,2012-10-19 08:21:47.944967
 
1677,3,demo,317,foo-baz,"",started_following_repo,2012-10-19 14:14:29.057573
 
1678,3,demo,317,foo-baz,"",user_created_repo,2012-10-19 14:14:29.070434
 
1679,3,demo,38,code-review-test,"",user_commented_revision:6d7db5794e8cad7da042b6ae6238116c6e59a4d2,2012-10-19 16:10:33.532318
 
1680,3,demo,249,abcdefg,"",user_commented_revision:ef6c825bc5699b95a31ae3075693b12693a623e2,2012-10-19 21:10:05.655859
 
1681,3,demo,249,abcdefg,"",user_commented_revision:ef6c825bc5699b95a31ae3075693b12693a623e2,2012-10-19 21:10:17.138554
 
1607,3,demo,306,testflow,69.36.131.254,"push:139bacf66d2ae74543bf01385d53434b5e619324,c9828e4c945cbbc0b98ebcb3633960a7495d6526",2012-10-16 20:15:52.423766
 
1608,3,demo,307,zippo,"",started_following_repo,2012-10-16 21:57:00.837578
 
1609,3,demo,307,zippo,"",user_created_repo,2012-10-16 21:57:00.852928
 
1610,3,demo,307,zippo,"",user_updated_repo,2012-10-16 21:58:05.136205
 
1611,3,demo,307,zippo,"",user_updated_repo,2012-10-16 21:58:17.135464
 
1612,1,default,306,testflow,92.225.130.117,pull,2012-10-16 23:26:14.536761
 
1613,3,demo,230,eks1,"",user_commented_revision:7be3eb971e236dd0c1d7b7c4637e7fab9c0a8eff,2012-10-17 10:01:12.801645
 
1614,3,demo,230,eks1,"",user_commented_revision:7be3eb971e236dd0c1d7b7c4637e7fab9c0a8eff,2012-10-17 10:01:24.827945
 
1615,3,demo,308,fork-abcdefg,"",started_following_repo,2012-10-17 10:46:38.608309
 
1616,3,demo,249,abcdefg,"",user_forked_repo:fork-abcdefg,2012-10-17 10:46:38.625094
 
1617,3,demo,308,fork-abcdefg,"",user_created_fork:fork-abcdefg,2012-10-17 10:46:38.636906
 
1618,3,demo,308,fork-abcdefg,"",push_local:89b42b250956797b6bad5c7edbf873efe1b03d75,2012-10-17 10:47:28.606347
 
1619,3,demo,249,abcdefg,"",user_commented_pull_request:69,2012-10-17 10:51:05.868185
 
1620,2,admin,249,abcdefg,"",user_commented_pull_request:69,2012-10-17 15:34:01.14742
 
1621,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:125ff5654b72009b251706d7ee93051853f066b6,2012-10-17 15:36:37.784768
 
1622,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:125ff5654b72009b251706d7ee93051853f066b6,2012-10-17 15:37:36.599064
 
1623,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:125ff5654b72009b251706d7ee93051853f066b6,2012-10-17 15:38:14.176552
 
1624,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:125ff5654b72009b251706d7ee93051853f066b6,2012-10-17 15:38:41.016672
 
1625,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:1bd18c415eec578b5a8cc3bb61c65e554f4674e1,2012-10-17 15:39:31.815756
 
1626,276,niels,309,fork-bla,"",started_following_repo,2012-10-17 16:14:16.700471
 
1627,276,niels,278,bla,"",user_forked_repo:fork-bla,2012-10-17 16:14:16.804166
 
1628,276,niels,309,fork-bla,"",user_created_fork:fork-bla,2012-10-17 16:14:16.818566
 
1629,3,demo,249,abcdefg,"",user_commented_pull_request:69,2012-10-17 16:21:09.732638
 
1630,3,demo,249,abcdefg,"",user_closed_pull_request:69,2012-10-17 16:21:09.743958
 
1631,3,demo,310,ForkMe,"",started_following_repo,2012-10-17 16:39:43.040558
 
1632,3,demo,310,ForkMe,"",user_created_repo,2012-10-17 16:39:43.051548
 
1633,3,demo,310,ForkMe,20.132.68.148,"push:20867b19ea55d7afa34238c5b42e8f0cf9336fb9,57b41cfbab38011c7d95d929afe8c54d41d229c7,c473af323363c2ce57b1dd3baaf671eabbbe3d9b,11d5db13f3886df26fa9052d664dd99c7ad7a32f,d7d1bb376a19e46ce927520f6863c286aae3d118,160f86cca435674ce9fbd7fb34a7eb1684cd753e,44d8bad99c89ba30af51c0fb96d0c4f5ff679b67,12253658153cfdcab846f64b91f13f56631abae1,ec85db68de4419c2cdaa9e9a4c0cd0a12e161c9e,98e055683c7acd57b6393fffb5bc9ef7fd8386aa,9fd9140573cfccdb795905c962d515fd199024a1",2012-10-17 16:40:52.585834
 
1634,3,demo,311,ForkForForkMe,"",started_following_repo,2012-10-17 16:41:54.089171
 
1635,3,demo,310,ForkMe,"",user_forked_repo:ForkForForkMe,2012-10-17 16:41:54.105915
 
1636,3,demo,311,ForkForForkMe,"",user_created_fork:ForkForForkMe,2012-10-17 16:41:54.119943
 
1637,1,default,311,ForkForForkMe,20.132.68.148,pull,2012-10-17 16:42:50.019391
 
1638,3,demo,311,ForkForForkMe,20.132.68.148,push:7f7a317f656658d18438fa4f2effca0cfe1bee77,2012-10-17 16:43:30.115193
 
1639,3,demo,310,ForkMe,"",user_commented_pull_request:70,2012-10-17 16:45:19.643124
 
1640,3,demo,310,ForkMe,"",user_closed_pull_request:70,2012-10-17 16:45:19.651818
 
1641,1,default,310,ForkMe,20.132.68.148,pull,2012-10-17 16:55:41.290306
 
1642,1,default,311,ForkForForkMe,20.132.68.148,pull,2012-10-17 17:01:31.007755
 
1643,1,default,310,ForkMe,20.132.68.148,pull,2012-10-17 17:02:42.098164
 
1644,1,default,311,ForkForForkMe,20.132.68.148,pull,2012-10-17 17:05:59.739608
 
1645,3,demo,311,ForkForForkMe,20.132.68.148,"push:3ebc10c9b1ea1d26ff9ede63104d6ab24bf6d37d,e2687070a7d4092aafde9343ad79c57c39ec016f",2012-10-17 17:17:21.346216
 
1646,1,default,310,ForkMe,20.132.68.148,pull,2012-10-17 17:17:56.010058
 
1647,3,demo,312,pepepe,"",started_following_repo,2012-10-17 17:20:14.076678
 
1648,3,demo,312,pepepe,"",user_created_repo,2012-10-17 17:20:14.089715
 
1649,3,demo,311,ForkForForkMe,20.132.68.148,"push:37298d3eed24e9209bfaf5b43bda114b28d99363,1dc8b7b3029c583069aa80ebc5b570c11cea998b",2012-10-17 17:20:19.128212
 
1650,3,demo,312,pepepe,"",push_local:72fc0eb74ecaffd64c3594744f8ad0634f68ab2b,2012-10-17 17:20:35.135261
 
1651,3,demo,312,pepepe,"",user_commented_revision:72fc0eb74ecaffd64c3594744f8ad0634f68ab2b,2012-10-17 17:20:53.662433
 
1652,3,demo,313,fork-pepepe,"",started_following_repo,2012-10-17 17:21:29.352267
 
1653,3,demo,312,pepepe,"",user_forked_repo:fork-pepepe,2012-10-17 17:21:29.36938
 
1654,3,demo,313,fork-pepepe,"",user_created_fork:fork-pepepe,2012-10-17 17:21:29.382134
 
1655,3,demo,313,fork-pepepe,"",push_local:d96f66d613e7c90004b0be702fa00acb5c64d22b,2012-10-17 17:22:27.210919
 
1656,1,default,311,ForkForForkMe,20.132.68.148,pull,2012-10-17 17:22:51.855061
 
1657,3,demo,312,pepepe,"",user_commented_pull_request:71,2012-10-17 17:23:15.633271
 
1658,3,demo,312,pepepe,"",user_closed_pull_request:71,2012-10-17 17:23:15.639775
 
1659,1,default,310,ForkMe,20.132.68.148,pull,2012-10-17 19:44:37.643519
 
1660,1,default,311,ForkForForkMe,20.132.68.148,pull,2012-10-17 19:49:02.152121
 
1661,1,default,311,ForkForForkMe,20.132.68.148,pull,2012-10-17 19:51:33.051372
 
1662,1,default,310,ForkMe,20.132.68.148,pull,2012-10-17 20:02:23.092402
 
1663,1,default,311,ForkForForkMe,20.132.68.148,pull,2012-10-17 20:21:12.146576
 
1664,3,demo,269,fork-foofootest,"",user_updated_repo,2012-10-17 20:39:09.557172
 
1682,3,demo,249,abcdefg,"",user_commented_revision:5d80e28538141e322b317168e2367fb03178d58c,2012-10-19 21:11:07.868323
 
1683,280,SylvainC,318,testrcd99,"",started_following_repo,2012-10-19 22:52:25.55997
 
1684,280,SylvainC,318,testrcd99,"",user_created_repo,2012-10-19 22:52:25.572046
 
1685,281,coderazor,38,code-review-test,"",user_commented_pull_request:65,2012-10-19 23:15:14.542145
 
1686,281,coderazor,38,code-review-test,"",user_commented_pull_request:65,2012-10-19 23:16:01.295617
 
1687,281,coderazor,38,code-review-test,"",user_commented_pull_request:65,2012-10-19 23:20:08.509514
 
1688,281,coderazor,319,fork1-code-review-test,"",started_following_repo,2012-10-20 00:46:43.404342
 
1689,281,coderazor,38,code-review-test,"",user_forked_repo:fork1-code-review-test,2012-10-20 00:46:43.464675
 
1690,281,coderazor,319,fork1-code-review-test,"",user_created_fork:fork1-code-review-test,2012-10-20 00:46:43.473779
 
1691,281,coderazor,319,fork1-code-review-test,"",push_local:98690895f701c1827ea962fe81985b6094a3f00e,2012-10-20 00:48:45.66637
 
1692,281,coderazor,319,fork1-code-review-test,"",push_local:b364947ef413a4b2f43bb76ba221d47c1794a8e1,2012-10-20 00:49:40.078971
 
1693,281,coderazor,319,fork1-code-review-test,"",user_commented_revision:b364947ef413a4b2f43bb76ba221d47c1794a8e1,2012-10-20 00:50:35.035023
 
1694,281,coderazor,38,code-review-test,"",user_commented_pull_request:72,2012-10-20 00:54:57.701596
 
1695,281,coderazor,38,code-review-test,"",user_commented_pull_request:72,2012-10-20 00:55:44.681278
 
1696,281,coderazor,38,code-review-test,"",user_commented_pull_request:72,2012-10-20 00:55:59.492315
 
1697,281,coderazor,319,fork1-code-review-test,"",push_local:e216971a777e3132487405dd2c8e093f66788765,2012-10-20 00:59:53.583102
 
1698,281,coderazor,38,code-review-test,"",user_commented_pull_request:72,2012-10-20 01:01:16.602261
 
1699,281,coderazor,38,code-review-test,"",user_commented_pull_request:72,2012-10-20 01:03:46.692176
 
1700,281,coderazor,38,code-review-test,"",user_commented_pull_request:73,2012-10-20 01:06:18.310904
 
1701,281,coderazor,38,code-review-test,"",user_commented_pull_request:72,2012-10-20 01:07:52.891399
 
1702,281,coderazor,38,code-review-test,"",user_closed_pull_request:72,2012-10-20 01:07:52.900684
 
1703,283,vaidasn,320,svn2git.git,"",started_following_repo,2012-10-20 19:40:57.345453
 
1704,283,vaidasn,320,svn2git.git,"",user_created_repo,2012-10-20 19:40:57.365761
 
1705,3,demo,321,Mecurial-Test,"",started_following_repo,2012-10-22 06:13:45.980502
 
1706,3,demo,321,Mecurial-Test,"",user_created_repo,2012-10-22 06:13:45.997596
 
1707,3,demo,321,Mecurial-Test,69.196.152.196,push:e66dfe4e33871da460d3807c8b015863bf7240b7,2012-10-22 06:54:33.247493
 
1708,3,demo,321,Mecurial-Test,"",user_updated_repo,2012-10-22 06:56:19.772283
 
1709,3,demo,321,Mecurial-Test,69.196.152.196,push:eee6785689defc10df9fe6e8d0921facaab0e176,2012-10-22 07:08:00.585766
 
1710,3,demo,321,Mecurial-Test,69.196.152.196,push:fd10c02cfbfbf4a7d7659c67998c6f95da5dc4de,2012-10-22 07:10:59.095472
 
1711,254,yujiro,322,fork-code-review-dev,"",started_following_repo,2012-10-22 10:01:47.558754
 
1712,254,yujiro,173,code-review-dev,"",user_forked_repo:fork-code-review-dev,2012-10-22 10:01:47.58102
 
1713,254,yujiro,322,fork-code-review-dev,"",user_created_fork:fork-code-review-dev,2012-10-22 10:01:47.59189
 
1714,285,zza,323,TestZZa,"",started_following_repo,2012-10-22 11:36:34.479105
 
1715,285,zza,323,TestZZa,"",user_created_repo,2012-10-22 11:36:34.488683
 
1716,285,zza,323,TestZZa,"",user_updated_repo,2012-10-22 11:37:27.008002
 
1717,285,zza,323,TestZZa,"",user_updated_repo,2012-10-22 11:37:40.09398
 
1718,3,demo,285,aloha,"",push_local:f6aea433e6b6cb05d4af9ac74bac0da5fd09c8ba,2012-10-22 12:50:54.991895
 
1719,1,default,321,Mecurial-Test,67.70.161.159,pull,2012-10-22 15:41:30.593105
 
1720,3,demo,321,Mecurial-Test,67.70.161.159,push:041e48fd7acad4c27385c27a4789d3d5cc7ccbea,2012-10-22 16:39:38.382409
 
1721,1,default,321,Mecurial-Test,69.196.152.196,pull,2012-10-22 23:13:11.713227
 
1722,3,demo,325,testkyro,"",started_following_repo,2012-10-23 13:27:46.011096
 
1723,3,demo,325,testkyro,"",user_created_repo,2012-10-23 13:27:46.024014
 
1724,3,demo,325,testkyro,"",user_updated_repo,2012-10-23 13:28:29.072813
 
1725,3,demo,326,ReallyCoolProject,"",started_following_repo,2012-10-23 14:22:15.477077
 
1726,3,demo,326,ReallyCoolProject,"",user_created_repo,2012-10-23 14:22:15.492068
 
1727,3,demo,326,ReallyCoolProject,"",push_local:262220ea2a60e92577f2193cd9ee4f9707760fb5,2012-10-23 14:23:56.826353
 
1728,288,kiall,327,kiall-test,"",started_following_repo,2012-10-23 15:50:27.397495
 
1729,288,kiall,327,kiall-test,"",user_created_repo,2012-10-23 15:50:27.42126
 
1730,288,kiall,329,fork-aaa-projects,"",started_following_repo,2012-10-23 15:53:23.020591
 
1731,288,kiall,68,aaa-project,"",user_forked_repo:fork-aaa-projects,2012-10-23 15:53:23.043059
 
1732,288,kiall,329,fork-aaa-projects,"",user_created_fork:fork-aaa-projects,2012-10-23 15:53:23.052289
 
1733,288,kiall,328,kiall-nova,"",started_following_repo,2012-10-23 15:53:45.417443
 
1734,288,kiall,328,kiall-nova,"",user_created_repo,2012-10-23 15:53:45.434684
 
1735,288,kiall,329,fork-aaa-projects,"",push_local:417cac332ab3512a08d5454cfcbffc21471e1f6f,2012-10-23 15:53:50.165591
 
1736,3,demo,330,z123,"",started_following_repo,2012-10-23 15:58:30.652495
 
1737,3,demo,330,z123,"",user_created_repo,2012-10-23 15:58:30.665854
 
1738,3,demo,330,z123,"",push_local:0ba461ee4cd15d51f416b1073d4389574150f5ca,2012-10-23 15:59:26.238194
 
1739,3,demo,330,z123,"",user_updated_repo,2012-10-23 16:01:08.667715
 
1740,288,kiall,331,kiall-hg,"",started_following_repo,2012-10-23 16:01:24.811434
 
1741,288,kiall,331,kiall-hg,"",user_created_repo,2012-10-23 16:01:24.820628
 
1742,1,default,330,z123,80.149.98.186,pull,2012-10-23 16:02:35.273406
 
1743,3,demo,330,z123,80.149.98.186,push:b89e8c4620b21ec38d159c644b173a1c93efafea,2012-10-23 16:04:08.66449
 
1744,3,demo,330,z123,"",user_commented_revision:b89e8c4620b21ec38d159c644b173a1c93efafea,2012-10-23 16:04:55.372793
 
1745,2,admin,,"","",admin_updated_user:kiall,2012-10-23 16:05:04.180487
 
1746,3,demo,330,z123,"",stopped_following_repo,2012-10-23 16:16:39.414967
 
1747,3,demo,34,a,"",push_local:106ab79178979f8e464e5cc8f432347f8c203dde,2012-10-23 16:24:17.669006
 
1748,3,demo,332,IAmTesting-this,"",started_following_repo,2012-10-23 18:51:16.88748
 
1749,3,demo,332,IAmTesting-this,"",user_created_repo,2012-10-23 18:51:16.902186
 
1750,3,demo,333,IAmTesting_this,"",started_following_repo,2012-10-23 19:15:24.347861
 
1751,3,demo,333,IAmTesting_this,"",user_created_repo,2012-10-23 19:15:24.361363
 
1752,3,demo,333,IAmTesting_this,"",user_updated_repo,2012-10-23 19:35:36.723229
 
1753,1,default,333,IAmTesting_this,194.117.18.103,push:31ca1f206de23b0d257dcbb323f9ba94e142ceb5,2012-10-23 19:59:07.360826
 
1754,3,demo,334,Test1qwerty,"",started_following_repo,2012-10-23 20:56:13.001385
 
1755,3,demo,334,Test1qwerty,"",user_created_repo,2012-10-23 20:56:13.014633
 
1756,3,demo,334,Test1qwerty,"",push_local:5957aa6f6f14241663b8b1a0ca050e43c3d3ca27,2012-10-23 20:57:25.88513
 
1757,3,demo,335,git,"",started_following_repo,2012-10-23 21:49:35.974797
 
1758,3,demo,335,git,"",user_created_repo,2012-10-23 21:49:35.994798
 
1759,3,demo,336,fork-cruel-test-2,"",started_following_repo,2012-10-23 23:49:23.770508
 
1760,3,demo,174,releases/cruel-test-2,"",user_forked_repo:fork-cruel-test-2,2012-10-23 23:49:23.85229
 
1761,3,demo,336,fork-cruel-test-2,"",user_created_fork:fork-cruel-test-2,2012-10-23 23:49:23.867582
 
1762,3,demo,337,why-testing,"",started_following_repo,2012-10-23 23:53:03.878941
 
1763,3,demo,337,why-testing,"",user_created_repo,2012-10-23 23:53:03.893321
 
1764,3,demo,338,temp11,"",started_following_repo,2012-10-24 10:43:46.379754
 
1765,3,demo,338,temp11,"",user_created_repo,2012-10-24 10:43:46.391127
 
1766,3,demo,339,test123,"",started_following_repo,2012-10-24 14:10:41.927001
 
1767,3,demo,339,test123,"",user_created_repo,2012-10-24 14:10:41.936239
 
1768,3,demo,339,releases/test123,"",user_updated_repo,2012-10-24 14:10:57.739304
 
1769,2,admin,339,releases/test123,146.48.87.66,push:87e9dcd8d3e375c218fdb747da52dc1551a93dc7,2012-10-24 14:12:02.63513
 
1770,292,Airframe,340,Testtestac,"",started_following_repo,2012-10-24 17:09:26.37836
 
1771,292,Airframe,340,Testtestac,"",user_created_repo,2012-10-24 17:09:26.387917
 
1772,293,imbehind,190,rhodecode,"",user_commented_revision:008d9c6f7c92636aaeda6f182bffecac6a464dd3,2012-10-24 20:38:59.535098
 
1773,3,demo,341,MicTest,"",started_following_repo,2012-10-24 20:59:34.176289
 
1774,3,demo,341,MicTest,"",user_created_repo,2012-10-24 20:59:34.186308
 
1775,3,demo,341,MicTest,"",push_local:327bf84d0d633a66f0c7ff4533de2415c9ff5a88,2012-10-24 21:00:28.379598
 
1776,295,mhassanzadeh,342,ttest,"",started_following_repo,2012-10-25 10:50:06.001658
 
1777,295,mhassanzadeh,342,ttest,"",user_created_repo,2012-10-25 10:50:06.011192
 
1807,306,foobar,,foobar,"",user_forked_repo:fork-foobar,2012-10-30 05:39:47.942232
 
1809,306,foobar,,foobar,24.67.50.255,push:0e3a7dcdd90bdb2a1f6dbe85e7b574e4f6304207,2012-10-30 05:50:43.083487
 
1781,3,demo,,fork-rawr,"",user_deleted_repo,2012-10-25 15:14:56.164313
 
1782,3,demo,343,test_git_repo,"",started_following_repo,2012-10-26 13:31:41.642802
 
1783,3,demo,343,test_git_repo,"",user_created_repo,2012-10-26 13:31:41.653854
 
1784,2,admin,99,another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-10-27 15:38:54.924143
 
1785,3,demo,344,sadfasdf,"",started_following_repo,2012-10-28 11:41:22.491275
 
1786,3,demo,344,sadfasdf,"",user_created_repo,2012-10-28 11:41:22.503388
 
1787,3,demo,345,fork-dvorak,"",started_following_repo,2012-10-29 09:43:08.276759
 
1788,3,demo,129,dvorak,"",user_forked_repo:fork-dvorak,2012-10-29 09:43:08.321733
 
1789,3,demo,345,fork-dvorak,"",user_created_fork:fork-dvorak,2012-10-29 09:43:08.329436
 
1790,3,demo,346,my-test-repo,"",started_following_repo,2012-10-29 09:45:29.684135
 
1791,3,demo,346,my-test-repo,"",user_created_repo,2012-10-29 09:45:29.694219
 
1792,3,demo,347,fork-aaa-project111,"",started_following_repo,2012-10-29 09:50:58.797507
 
1793,3,demo,68,aaa-project,"",user_forked_repo:fork-aaa-project111,2012-10-29 09:50:58.809098
 
1794,3,demo,347,fork-aaa-project111,"",user_created_fork:fork-aaa-project111,2012-10-29 09:50:58.816283
 
1795,2,admin,348,group/I-am-a-very-long-repository-name,"",started_following_repo,2012-10-29 15:51:18.519038
 
1796,2,admin,348,group/I-am-a-very-long-repository-name,"",admin_created_repo,2012-10-29 15:51:18.528651
 
1797,3,demo,34,a-very-long-usper-loooong-name-that-is-to-long,"",user_updated_repo,2012-10-29 17:32:06.365281
 
1798,3,demo,350,misisko-repo,"",started_following_repo,2012-10-29 20:19:56.180975
 
1799,3,demo,350,misisko-repo,"",user_created_repo,2012-10-29 20:19:56.190032
 
1800,3,demo,350,misisko-repo,195.168.239.153,push:34bd2e2b6cf2abdb0e026182b9342f95d8f6f440,2012-10-29 20:21:33.067763
 
1801,3,demo,350,misisko-repo,"",user_commented_revision:34bd2e2b6cf2abdb0e026182b9342f95d8f6f440,2012-10-29 20:23:32.816207
 
1802,2,admin,350,misisko-repo,"",push_local:89a041cce422153ba0716a2beb2b5711ee4f4280,2012-10-29 21:23:56.649892
 
1806,306,foobar,,fork-foobar,"",started_following_repo,2012-10-30 05:39:47.86196
 
1808,306,foobar,,fork-foobar,"",user_created_fork:fork-foobar,2012-10-30 05:39:47.956653
 
1811,306,foobar,,fork-foobar,"",user_deleted_repo,2012-10-30 05:56:06.059093
 
1803,306,foobar,,foobar,"",started_following_repo,2012-10-30 05:36:49.915108
 
1804,306,foobar,,foobar,"",user_created_repo,2012-10-30 05:36:49.929097
 
1805,306,foobar,,foobar,24.67.50.255,push:3b0ad3c9b89dec8bcac5ec8bc9846f307dd5f291,2012-10-30 05:38:30.960676
 
1810,306,foobar,,foobar,24.67.50.255,push:5066e223f81d3983b9bc4d959c509bbce326474c,2012-10-30 05:53:14.168715
 
1812,306,foobar,,foobar,"",user_deleted_repo,2012-10-30 05:56:35.211293
 
1813,3,demo,354,DibaDaba,"",started_following_repo,2012-10-30 10:55:03.068862
 
1814,3,demo,354,DibaDaba,"",user_created_repo,2012-10-30 10:55:03.088077
 
1815,3,demo,354,DibaDaba,"",push_local:cf41636a602d2a69128cc58fdf441857afb83827,2012-10-30 10:56:16.451197
 
1816,3,demo,354,DibaDaba,"",user_updated_repo,2012-10-30 11:05:50.836108
 
1817,3,demo,354,DibaDaba,"",push_local:15453a2035510dcefbc8b7f3e45b916003ae4a0f,2012-10-30 11:18:42.79919
 
1818,3,demo,355,Test-RohdeCode,"",started_following_repo,2012-10-30 21:07:27.016976
 
1819,3,demo,355,Test-RohdeCode,"",user_created_repo,2012-10-30 21:07:27.040381
 
1820,3,demo,355,Test-RohdeCode,"",push_local:a2c7c944a5bae039181a84bec8bc89a9bb4ac68c,2012-10-31 10:52:21.038578
 
1821,3,demo,355,Test-RohdeCode,"",push_local:303c0051c7a04b5a4f77654d8cfeb09a61322e15,2012-10-31 16:32:16.917289
 
1822,3,demo,356,testdzone,"",started_following_repo,2012-11-02 15:51:18.982652
 
1823,3,demo,356,testdzone,"",user_created_repo,2012-11-02 15:51:18.994144
 
1824,3,demo,357,firs,"",started_following_repo,2012-11-04 00:37:08.689703
 
1825,3,demo,357,firs,"",user_created_repo,2012-11-04 00:37:08.700977
 
1826,316,theo,358,brightandshiny,"",started_following_repo,2012-11-04 14:17:04.270938
 
1827,316,theo,358,brightandshiny,"",user_created_repo,2012-11-04 14:17:04.286049
 
1828,316,theo,358,brightandshiny,87.165.13.203,"push:831fd48093c38f64bb541a4c12bec45d27c13f9d,0177264991ad113c2dbeed00716738931bc0222f",2012-11-04 14:21:33.759458
 
1829,3,demo,45,group/fork-bootstrap,"",started_following_repo,2012-11-04 18:25:45.459487
 
1830,3,demo,45,group/fork-bootstrap,"",stopped_following_repo,2012-11-04 18:25:48.166886
 
1831,3,demo,45,group/fork-bootstrap,"",started_following_repo,2012-11-04 18:25:51.905362
 
1832,3,demo,45,group/fork-bootstrap,"",stopped_following_repo,2012-11-04 18:25:54.406445
 
1833,3,demo,227,fork-aaa-project-2,"",user_commented_revision:bc829c34912709c7d129e5dae9a3e5ff46e77fc7,2012-11-05 18:37:48.772572
 
1834,3,demo,227,fork-aaa-project-2,"",user_commented_revision:bc829c34912709c7d129e5dae9a3e5ff46e77fc7,2012-11-05 18:38:42.521316
 
1835,3,demo,359,MyUberRepo,"",started_following_repo,2012-11-05 22:04:02.939575
 
1836,3,demo,359,MyUberRepo,"",user_created_repo,2012-11-05 22:04:02.95609
 
1837,3,demo,359,MyUberRepo,"",push_local:a67ddbdca6d533e0cd43175068cc12f526b2f95f,2012-11-05 22:07:40.846096
 
1838,3,demo,360,marese_test,"",started_following_repo,2012-11-05 22:10:35.535744
 
1839,3,demo,360,marese_test,"",user_created_repo,2012-11-05 22:10:35.547878
 
1840,3,demo,361,test-23,"",started_following_repo,2012-11-06 04:01:46.385817
 
1841,3,demo,361,test-23,"",user_created_repo,2012-11-06 04:01:46.410423
 
1842,3,demo,361,test-23,"",push_local:7d8547b154a01c7055a09292e871e80f3c6b574b,2012-11-06 04:03:03.320736
 
1843,3,demo,361,test-23,"",user_commented_revision:7d8547b154a01c7055a09292e871e80f3c6b574b,2012-11-06 04:07:20.51212
 
1844,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-11-06 04:12:51.753053
 
1845,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-11-06 04:13:30.727101
 
1846,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:fba17a64fa4978bfea19222da5e64a18cfddeecd,2012-11-06 04:15:29.032768
 
1847,3,demo,68,aaa-project,"",user_commented_revision:0c33fa58efc5a5541d8d3f1a3d3b77367e3d94f5,2012-11-06 04:17:16.091927
 
1848,3,demo,249,abcdefg,"",user_commented_revision:5d80e28538141e322b317168e2367fb03178d58c,2012-11-06 06:10:53.372505
 
1849,3,demo,362,Marcin,"",started_following_repo,2012-11-06 10:45:38.505485
 
1850,3,demo,362,Marcin,"",user_created_repo,2012-11-06 10:45:38.518969
 
1851,3,demo,362,hidden/Marcin,"",user_updated_repo,2012-11-06 10:45:46.281581
 
1852,3,demo,177,blah,62.200.22.2,push:b369fb18c8d61fe0d3b14c417466680230cabe46,2012-11-06 10:47:55.655029
 
1853,3,demo,99,another-fork-to-check-code-review,"",user_commented_revision:d5422faf648cc589425cd3b0dbf1f6dbf93036a0,2012-11-06 13:12:05.517155
 
1854,3,demo,38,code-review-test,"",user_commented_revision:6d7db5794e8cad7da042b6ae6238116c6e59a4d2,2012-11-06 16:12:59.38977
 
1855,3,demo,363,utf8-test,"",started_following_repo,2012-11-06 16:52:34.020264
 
1856,3,demo,363,utf8-test,"",user_created_repo,2012-11-06 16:52:34.036171
 
1857,3,demo,363,utf8-test,178.6.80.143,push:e9e69068b8277c8e857984fb44e54d4e057710bd,2012-11-06 16:54:30.357337
 
1858,320,blahblub,364,abc_test,"",started_following_repo,2012-11-06 22:06:45.476725
 
1859,320,blahblub,364,abc_test,"",user_created_repo,2012-11-06 22:06:45.488546
 
1860,320,blahblub,364,abc_test,81.190.220.154,"push:e05d82d631f4a61972c2c76eb5b473c55ee6133f,dccf54ebc0638183872cfd9d35f0f49aa44ad4bc",2012-11-06 22:07:39.657839
 
1861,320,blahblub,364,abc_test,81.190.220.154,push:8ef2f06b68eb25067c4ca3a9c73c89bb681f031b,2012-11-06 22:09:18.572762
 
1862,3,demo,365,testing_do,"",started_following_repo,2012-11-07 00:19:56.15291
 
1863,3,demo,365,testing_do,"",user_created_repo,2012-11-07 00:19:56.165626
 
1864,3,demo,365,testing_do,"",user_updated_repo,2012-11-07 00:21:24.482025
 
1865,3,demo,321,Mecurial-Test,"",user_commented_revision:041e48fd7acad4c27385c27a4789d3d5cc7ccbea,2012-11-07 01:16:37.129361
 
1866,321,ifco89,284,fork-django,"",user_commented_revision:129f1ac8484d63c2e61a44fb2a18dd17246c1c4d,2012-11-07 01:26:40.887017
 
1867,3,demo,284,fork-django,"",user_commented_revision:c5d6f6d6829e730bdddf63c1252304f0c49a9053,2012-11-07 01:27:33.995596
 
1868,3,demo,68,aaa-project,"",push_local:5ecd97456233badb3680873dc5b7d4bfb52ede79,2012-11-07 06:43:22.378406
 
1869,3,demo,319,fork1-code-review-test,"",user_commented_revision:e216971a777e3132487405dd2c8e093f66788765,2012-11-07 08:44:19.419642
 
1870,3,demo,366,test123123,"",started_following_repo,2012-11-07 14:16:13.029479
 
1871,3,demo,366,test123123,"",user_created_repo,2012-11-07 14:16:13.04346
 
1872,323,didi,364,abc_test,"",user_commented_revision:8ef2f06b68eb25067c4ca3a9c73c89bb681f031b,2012-11-07 15:45:10.378961
 
1873,324,tutty,367,fork-bootstrap,"",started_following_repo,2012-11-07 16:00:47.116111
 
1874,324,tutty,36,bootstrap,"",user_forked_repo:fork-bootstrap,2012-11-07 16:00:48.378051
 
1875,324,tutty,367,fork-bootstrap,"",user_created_fork:fork-bootstrap,2012-11-07 16:00:48.393002
 
1876,3,demo,68,aaa-project,"",user_commented_revision:b4bf1f77b1288a24eb395537319b4f3155cffa71,2012-11-08 18:41:07.016059
 
1877,3,demo,68,aaa-project,"",user_commented_revision:b4bf1f77b1288a24eb395537319b4f3155cffa71,2012-11-08 18:41:34.311311
 
1878,3,demo,68,aaa-project,"",user_commented_revision:b4bf1f77b1288a24eb395537319b4f3155cffa71,2012-11-08 18:41:38.071834
 
1879,3,demo,368,Repotest,"",started_following_repo,2012-11-09 10:40:40.804085
 
1880,3,demo,368,Repotest,"",user_created_repo,2012-11-09 10:40:40.813114
 
1881,3,demo,369,fork-HelloWorld,"",started_following_repo,2012-11-10 19:57:46.238558
 
1882,3,demo,280,HelloWorld,"",user_forked_repo:fork-HelloWorld,2012-11-10 19:57:46.306001
 
1883,3,demo,369,fork-HelloWorld,"",user_created_fork:fork-HelloWorld,2012-11-10 19:57:46.320675
 
1884,3,demo,370,fork-django-more,"",started_following_repo,2012-11-11 01:18:51.709667
 
1885,3,demo,110,django,"",user_forked_repo:fork-django-more,2012-11-11 01:18:58.716934
 
1886,3,demo,370,fork-django-more,"",user_created_fork:fork-django-more,2012-11-11 01:18:58.731127
 
1887,3,demo,371,hgh,"",started_following_repo,2012-11-12 06:07:06.509759
 
1888,3,demo,371,hgh,"",user_created_repo,2012-11-12 06:07:06.525795
 
1889,3,demo,371,hgh,"",push_local:b43f437976ff61a8fa37709f105091ffd00bbd2c,2012-11-12 06:08:34.009007
 
1890,3,demo,371,hgh,"",push_local:93c5a23d3cbde4c6dbd21d722eb1beff90a1d67c,2012-11-12 06:09:44.749181
 
1891,3,demo,371,hgh,"",push_local:d3e97cf131b0feaa586272d88e71e97a65564806,2012-11-12 06:13:04.240444
 
1892,336,demodemo,373,test-for,"",started_following_repo,2012-11-12 18:29:12.02868
 
1893,336,demodemo,373,test-for,"",user_created_repo,2012-11-12 18:29:12.041121
 
1894,336,demodemo,374,fork-test-for,"",started_following_repo,2012-11-12 18:29:25.869055
 
1895,336,demodemo,373,test-for,"",user_forked_repo:fork-test-for,2012-11-12 18:29:25.922561
 
1896,336,demodemo,374,fork-test-for,"",user_created_fork:fork-test-for,2012-11-12 18:29:25.936869
 
1897,336,demodemo,374,fork-test-for,101.140.96.42,push:a7495b86f0bfc299740cdbfbbca1b9d5ca1f62de,2012-11-12 18:31:51.107494
 
1898,2,admin,376,linux-kernel,"",started_following_repo,2012-11-13 22:14:17.466937
 
1899,342,gauravve,377,myrep,"",started_following_repo,2012-11-14 12:12:46.280751
 
1900,342,gauravve,377,myrep,"",user_created_repo,2012-11-14 12:12:46.296606
 
1901,343,yasser.a,125,test-to-end-all-tests,"",user_commented_revision:fb4eb182028a674ae250430c04305e9b3fbe508e,2012-11-14 16:17:28.970017
 
772,2,admin,,cruel-test,"",started_following_repo,2012-08-28 10:23:44.560576
 
1902,254,yujiro,378,arai-new-repo,"",started_following_repo,2012-11-15 02:39:50.649631
 
1903,254,yujiro,378,arai-new-repo,"",user_created_repo,2012-11-15 02:39:50.667177
 
1904,254,yujiro,378,arai-new-repo,182.171.245.184,push:6beb6da3b0e27eb1401090e122f7675d56e07fc1,2012-11-15 02:45:25.207338
 
1905,3,demo,381,test01012145,"",started_following_repo,2012-11-16 13:02:38.980282
 
1906,3,demo,381,test01012145,"",user_created_repo,2012-11-16 13:02:38.989119
 
1907,3,demo,381,test01012145,"",push_local:225a9898957de5f78ac2aa8e4d46a80eed3ee6d5,2012-11-16 13:04:53.384353
 
1908,3,demo,382,aaa-repo-fork,"",started_following_repo,2012-11-17 12:58:42.919876
 
1909,3,demo,67,group/aaa-repo,"",user_forked_repo:aaa-repo-fork,2012-11-17 12:58:42.981111
 
1910,3,demo,382,aaa-repo-fork,"",user_created_fork:aaa-repo-fork,2012-11-17 12:58:42.992071
 
1911,3,demo,382,aaa-repo-fork,"",user_updated_repo,2012-11-17 12:59:32.084662
 
1912,2,admin,,"","",admin_updated_user:kiall,2012-11-17 21:52:15.776253
 
1913,3,demo,268,foofootest,"",user_commented_revision:4bc0645c20363db85c9a5050a85c2c05a1991765,2012-11-20 12:19:44.614295
 
1914,3,demo,383,aaa-test-repo,"",started_following_repo,2012-11-20 12:27:16.120325
 
1915,3,demo,383,aaa-test-repo,"",user_created_repo,2012-11-20 12:27:16.130553
 
1916,3,demo,383,aaa-test-repo,"",push_local:fb2f5ae9a806abe4cb03fe7b11d4ad21a836f7b6,2012-11-20 12:27:41.98988
 
1917,3,demo,384,aaa-test-repo2,"",started_following_repo,2012-11-20 12:31:43.009679
 
1918,3,demo,384,aaa-test-repo2,"",user_created_repo,2012-11-20 12:31:43.019015
 
1919,3,demo,384,aaa-test-repo2,"",push_local:83a7be8f9d651912ee343067bd392678fbebe3e8,2012-11-20 12:32:34.336741
 
1920,3,demo,385,aaa-test-repo2-fork,"",started_following_repo,2012-11-20 12:58:25.715274
 
1921,3,demo,384,aaa-test-repo2,"",user_forked_repo:aaa-test-repo2-fork,2012-11-20 12:58:25.729374
 
1922,3,demo,385,aaa-test-repo2-fork,"",user_created_fork:aaa-test-repo2-fork,2012-11-20 12:58:25.737204
 
1923,3,demo,385,aaa-test-repo2-fork,"",push_local:af794c0c7cf39be92c6b59bb8b7871d313b1d248,2012-11-20 12:58:59.668087
 
1924,3,demo,384,aaa-test-repo2,"",user_commented_pull_request:74,2012-11-20 13:25:32.773937
 
1925,3,demo,384,aaa-test-repo2,"",user_commented_pull_request:74,2012-11-20 13:33:39.823854
 
1926,3,demo,384,aaa-test-repo2,"",user_closed_pull_request:74,2012-11-20 13:33:39.828583
 
1927,3,demo,385,aaa-test-repo2-fork,"",push_local:67120aaf6ddd81cd2aabde6adc22e7ca90d15d12,2012-11-20 18:41:48.280705
 
1928,3,demo,384,aaa-test-repo2,81.178.131.20,"push:af794c0c7cf39be92c6b59bb8b7871d313b1d248,67120aaf6ddd81cd2aabde6adc22e7ca90d15d12",2012-11-20 20:01:34.101349
 
1929,3,demo,385,aaa-test-repo2-fork,"",push_local:5ece07f12c61645049e7d2d3d33797942b16cba5,2012-11-20 20:10:49.816215
 
1930,3,demo,385,aaa-test-repo2-fork,"",push_local:fd8a6936e27e3c31684155790f78effb33e6cc5c,2012-11-20 20:24:06.305599
 
1931,3,demo,384,aaa-test-repo2,81.178.131.20,push:5ece07f12c61645049e7d2d3d33797942b16cba5,2012-11-20 20:49:00.180794
 
1932,3,demo,384,aaa-test-repo2,81.178.131.20,push:fd8a6936e27e3c31684155790f78effb33e6cc5c,2012-11-20 21:28:16.281326
 
1933,3,demo,384,aaa-test-repo2,"",user_commented_pull_request:75,2012-11-21 01:38:22.165876
 
1934,3,demo,384,aaa-test-repo2,"",user_closed_pull_request:75,2012-11-21 01:38:22.175975
 
1935,3,demo,385,aaa-test-repo2-fork,"",push_local:586be5737b6b185d37ab249e028470417698b44d,2012-11-21 01:42:21.540009
 
1936,3,demo,385,aaa-test-repo2-fork,"",push_local:b836457cf5b358555c26193e67770d56e2345f4c,2012-11-21 01:50:03.178941
 
1937,3,demo,384,aaa-test-repo2,81.178.131.20,"push:586be5737b6b185d37ab249e028470417698b44d,b836457cf5b358555c26193e67770d56e2345f4c",2012-11-21 02:01:01.40853
 
1938,3,demo,34,a-very-long-usper-loooong-name-that-is-to-long,"",push_local:ff712eae5a99bede2bf710d86f86b0b534fbf089,2012-11-21 02:09:50.150788
 
1939,3,demo,68,aaa-project,"",user_commented_revision:b4bf1f77b1288a24eb395537319b4f3155cffa71,2012-11-21 08:36:43.456525
 
1940,3,demo,384,aaa-test-repo2,"",user_commented_revision:b836457cf5b358555c26193e67770d56e2345f4c,2012-11-21 12:03:06.317362
 
1941,3,demo,385,aaa-test-repo2-fork,"",push_local:d38a759ba1f79489db44854c9ddf06986f7e2b72,2012-11-21 12:17:04.303085
 
1942,3,demo,385,aaa-test-repo2-fork,"",user_commented_revision:d38a759ba1f79489db44854c9ddf06986f7e2b72,2012-11-21 12:17:47.536221
 
1943,3,demo,34,a-very-long-usper-loooong-name-that-is-to-long,"",user_commented_revision:f437e821a406d35b1e231c5a81e82853f8ed6436,2012-11-21 14:27:15.134067
 
1944,3,demo,386,I-am-a-very-long-repository-name-fork,"",started_following_repo,2012-11-21 15:31:17.25368
 
1945,3,demo,348,group/I-am-a-very-long-repository-name,"",user_forked_repo:I-am-a-very-long-repository-name-fork,2012-11-21 15:31:17.271794
 
1946,3,demo,386,I-am-a-very-long-repository-name-fork,"",user_created_fork:I-am-a-very-long-repository-name-fork,2012-11-21 15:31:17.283533
 
1947,3,demo,385,aaa-test-repo2-fork,"",user_commented_revision:d38a759ba1f79489db44854c9ddf06986f7e2b72,2012-11-21 16:35:17.484282
 
1948,3,demo,385,aaa-test-repo2-fork,"",push_local:96abb74e8e96a81a7dc5d472c70158da5318a623,2012-11-21 16:35:50.796373
 
1949,3,demo,385,aaa-test-repo2-fork,"",user_commented_revision:96abb74e8e96a81a7dc5d472c70158da5318a623,2012-11-21 16:36:25.797019
 
1950,2,admin,68,aaa-project,"",push_local:7db38281c68497cee8dc4510d77e03fbb4d6c395,2012-11-21 18:34:44.97296
 
1951,2,admin,68,aaa-project,"",push_local:de5af01cc0f75ab84966b11806c343000eeeb5d8,2012-11-21 18:36:10.869973
 
1952,3,demo,387,new-group-test-repos1,"",started_following_repo,2012-11-21 21:05:48.945007
 
1953,3,demo,387,new-group-test-repos1,"",user_created_repo,2012-11-21 21:05:48.953815
 
1954,3,demo,388,Logarithmic,"",started_following_repo,2012-11-22 11:30:39.744224
 
1955,3,demo,388,Logarithmic,"",user_created_repo,2012-11-22 11:30:39.761413
 
1956,3,demo,388,Logarithmic,"",push_local:72dd1a9ceecfcf9832e41dd66d355d5c63546b67,2012-11-22 11:35:30.523613
 
1957,3,demo,388,Logarithmic,"",push_local:fdb124c2a063a7ce15a1b3e42cdfa30a5bf19fcb,2012-11-22 11:52:07.237429
 
1958,364,hs_rcdemo,389,hsio_test,"",started_following_repo,2012-11-22 14:32:05.148189
 
1959,364,hs_rcdemo,389,hsio_test,"",user_created_repo,2012-11-22 14:32:05.163464
 
1960,364,hs_rcdemo,389,hsio_test,"",push_local:8777c89c909bfba8eaae07cf596cce85190d7789,2012-11-22 14:33:30.066876
 
1961,364,hs_rcdemo,389,hsio_test,"",user_updated_repo,2012-11-22 14:45:19.518307
 
1962,3,demo,390,ycxs,"",started_following_repo,2012-11-23 08:00:34.880042
 
1963,3,demo,390,ycxs,"",user_created_repo,2012-11-23 08:00:34.889356
 
1964,3,demo,110,django,"",user_commented_revision:129f1ac8484d63c2e61a44fb2a18dd17246c1c4d,2012-11-23 22:54:06.842764
 
1965,3,demo,68,aaa-project,"",user_commented_revision:de5af01cc0f75ab84966b11806c343000eeeb5d8,2012-11-25 18:05:15.626452
 
1966,373,roger,391,roger,"",started_following_repo,2012-11-27 10:19:17.098535
 
1967,373,roger,391,roger,"",user_created_repo,2012-11-27 10:19:17.110165
 
1968,373,roger,391,roger,195.67.17.194,push:3deefa3d90eb91fbfe7c7d97579842d26ffab526,2012-11-27 10:20:14.448706
 
1969,373,roger,394,roger-fork,"",started_following_repo,2012-11-27 10:44:06.565014
 
1970,373,roger,391,roger,"",user_forked_repo:roger-fork,2012-11-27 10:44:06.582941
 
1971,373,roger,394,roger-fork,"",user_created_fork:roger-fork,2012-11-27 10:44:06.591697
 
1972,373,roger,394,roger-fork,195.67.17.194,push:ef5703075e9bd3b498d0398be689c6ecc2aa68f2,2012-11-27 10:46:44.898629
 
1973,373,roger,391,roger,"",user_commented_pull_request:77,2012-11-27 10:49:00.02305
 
1974,373,roger,394,roger-fork,195.67.17.194,push:1f3690bd18da15796e2379ea2f82d510dbbfd634,2012-11-27 10:52:51.819376
 
1975,373,roger,391,roger,"",user_commented_pull_request:78,2012-11-27 10:55:01.836362
 
1976,373,roger,391,roger,"",user_closed_pull_request:78,2012-11-27 10:55:01.843519
 
1977,373,roger,391,roger,"",user_commented_pull_request:77,2012-11-27 10:55:43.206231
 
1978,373,roger,391,roger,"",user_updated_repo,2012-11-27 10:56:53.018675
 
1979,373,roger,391,roger,"",user_updated_repo,2012-11-27 11:02:27.558462
 
1980,373,roger,394,roger-fork,195.67.17.194,push:3a6d267941eeb0a8cd7be18d619d6fe370216f00,2012-11-27 11:04:37.480288
 
1981,374,roger2,391,roger,"",user_commented_pull_request:79,2012-11-27 11:05:56.858694
 
1982,374,roger2,391,roger,"",user_commented_pull_request:79,2012-11-27 11:06:02.182164
 
1983,374,roger2,391,roger,"",user_commented_pull_request:79,2012-11-27 11:06:38.109374
 
1984,374,roger2,391,roger,"",user_commented_pull_request:79,2012-11-27 11:07:34.474704
 
1985,374,roger2,391,roger,"",user_closed_pull_request:79,2012-11-27 11:07:34.485308
 
1986,373,roger,394,roger-fork,195.67.17.194,push:12cd31bebc666a85f8a0f0742093d5cd9ea585c4,2012-11-27 11:09:08.04061
 
1987,373,roger,395,rogerfork2,"",started_following_repo,2012-11-27 11:11:04.332674
 
1988,373,roger,391,roger,"",user_forked_repo:rogerfork2,2012-11-27 11:11:04.348686
 
1989,373,roger,395,rogerfork2,"",user_created_fork:rogerfork2,2012-11-27 11:11:04.359388
 
1990,373,roger,395,rogerfork2,195.67.17.194,"push:ef5703075e9bd3b498d0398be689c6ecc2aa68f2,1f3690bd18da15796e2379ea2f82d510dbbfd634,3a6d267941eeb0a8cd7be18d619d6fe370216f00,12cd31bebc666a85f8a0f0742093d5cd9ea585c4",2012-11-27 11:11:18.920484
 
1991,373,roger,391,roger,"",user_commented_pull_request:80,2012-11-27 11:12:23.228709
 
1992,373,roger,391,roger,"",user_commented_pull_request:80,2012-11-27 11:12:55.017541
 
1993,373,roger,391,roger,"",user_closed_pull_request:80,2012-11-27 11:12:55.027814
 
1994,3,demo,385,aaa-test-repo2-fork,"",push_local:872eeeb3a8a2783129bfd7d988323f5addac7ab1,2012-11-27 11:48:48.630984
 
1995,3,demo,384,aaa-test-repo2,"",user_commented_pull_request:76,2012-11-27 11:50:01.915064
 
1996,3,demo,384,aaa-test-repo2,"",user_commented_pull_request:76,2012-11-27 11:50:12.991796
 
1997,3,demo,384,aaa-test-repo2,"",user_closed_pull_request:76,2012-11-27 11:50:12.99591
 
1998,3,demo,396,тестовый-сервер,"",started_following_repo,2012-11-28 07:53:39.536654
 
1999,3,demo,396,тестовый-сервер,"",user_created_repo,2012-11-28 07:53:39.550591
 
2000,3,demo,397,simple-dev-fork,"",started_following_repo,2012-11-28 09:13:25.051649
 
2001,3,demo,210,simple-dev,"",user_forked_repo:simple-dev-fork,2012-11-28 09:13:25.106104
 
2002,3,demo,397,simple-dev-fork,"",user_created_fork:simple-dev-fork,2012-11-28 09:13:25.114908
 
2003,3,demo,385,aaa-test-repo2-fork,"",user_commented_revision:96abb74e8e96a81a7dc5d472c70158da5318a623,2012-11-28 12:24:53.581825
 
2004,3,demo,385,aaa-test-repo2-fork,"",user_commented_revision:872eeeb3a8a2783129bfd7d988323f5addac7ab1,2012-11-28 12:25:16.961119
 
2005,3,demo,398,aaa-project-fork-fork,"",started_following_repo,2012-11-29 14:08:09.275983
 
2006,3,demo,68,aaa-project,"",user_forked_repo:aaa-project-fork-fork,2012-11-29 14:08:09.413733
 
2007,3,demo,398,aaa-project-fork-fork,"",user_created_fork:aaa-project-fork-fork,2012-11-29 14:08:09.427854
 
2008,3,demo,68,aaa-project,"",user_updated_repo,2012-11-29 14:09:10.934065
 
2009,3,demo,68,aaa-project,"",user_updated_repo,2012-11-29 14:09:24.706033
 
2010,3,demo,399,tra,"",started_following_repo,2012-11-29 14:11:48.839858
 
2011,3,demo,399,tra,"",user_created_repo,2012-11-29 14:11:48.85278
 
2012,3,demo,42,foo,"",user_commented_revision:1b9a14ca778d48ebef5643f7aa2ce142f3a27617,2012-11-29 20:05:08.767523
 
2013,3,demo,42,foo,"",push_local:bb4dab01c0bd4241b903a4dc84a79c70a01b0f6b,2012-11-29 20:06:18.477822
 
2014,1,default,159,group/Test-for-code-review,"",push_local:eaca071ebe45eaf5fc6631b15d7cf079a0d5aaf1,2012-11-29 23:52:50.718898
 
2015,375,paul,400,hophop,"",started_following_repo,2012-11-30 08:50:31.403305
 
2016,375,paul,400,hophop,"",user_created_repo,2012-11-30 08:50:31.416463
 
2017,375,paul,400,hophop,"",push_local:558613aaa69def5e130b8f9583de37f911a80dd8,2012-11-30 08:51:37.956737
 
2018,375,paul,401,flepflep,"",started_following_repo,2012-11-30 08:52:56.146141
 
2019,375,paul,400,hophop,"",user_forked_repo:flepflep,2012-11-30 08:52:56.162784
 
2020,375,paul,401,flepflep,"",user_created_fork:flepflep,2012-11-30 08:52:56.171068
 
2021,375,paul,400,hophop,213.154.235.68,push:0c64f45ec8f43a5267d593a2af65c3b9965c312c,2012-11-30 08:54:23.238053
 
2022,376,mrntest,402,mrntest,"",started_following_repo,2012-11-30 10:10:14.463671
 
2023,376,mrntest,402,mrntest,"",user_created_repo,2012-11-30 10:10:14.475507
 
2024,1,default,159,group/Test-for-code-review,"",push_local:da1270d35961130d6fe12ba4777f412dabb533f7,2012-11-30 18:39:23.68212
 
2025,3,demo,177,blah,"",user_updated_repo,2012-11-30 21:43:04.925873
 
2026,1,default,159,group/Test-for-code-review,"",push_local:3bfcf2015dcc85f3334a4439099b1f4fe2ab87cc,2012-12-01 04:40:25.326381
 
2027,3,demo,385,aaa-test-repo2-fork,"",push_local:8caf16b59f0ac54d002daeaf54208319a055829a,2012-12-01 12:40:27.987379
 
2028,3,demo,385,aaa-test-repo2-fork,"",user_commented_revision:8caf16b59f0ac54d002daeaf54208319a055829a,2012-12-01 12:40:35.315142
 
2029,3,demo,403,aaa-test-repo2-fork1,"",started_following_repo,2012-12-01 12:43:30.698526
 
2030,3,demo,384,aaa-test-repo2,"",user_forked_repo:aaa-test-repo2-fork1,2012-12-01 12:43:30.7817
 
2031,3,demo,403,aaa-test-repo2-fork1,"",user_created_fork:aaa-test-repo2-fork1,2012-12-01 12:43:30.789849
 
2032,3,demo,403,aaa-test-repo2-fork1,"",push_local:7d46cab71f090b82e40f82aa164a237bffae8ca8,2012-12-01 12:43:54.847211
 
2033,3,demo,384,aaa-test-repo2,"",user_commented_pull_request:81,2012-12-01 12:45:15.004235
 
2034,3,demo,384,aaa-test-repo2,"",user_closed_pull_request:81,2012-12-01 12:45:15.01175
 
2035,1,default,159,group/Test-for-code-review,"",push_local:88f2b300127f7249d6b2ac03d4e368cd7a043073,2012-12-02 06:49:39.201427
 
2036,380,han,42,foo,"",user_commented_revision:ca953e8c5c1ada44e9a8f945a0a6999d2f44310d,2012-12-03 05:54:40.845102
 
2037,380,han,42,foo,"",user_commented_revision:ca953e8c5c1ada44e9a8f945a0a6999d2f44310d,2012-12-03 05:54:52.733614
 
2038,380,han,42,foo,"",user_commented_revision:ca953e8c5c1ada44e9a8f945a0a6999d2f44310d,2012-12-03 05:55:06.032348
 
2039,380,han,184,fork-aaa-project,"",user_commented_revision:e3fef0be8dc20eb1fa68fc45292d9d66de1cc67f,2012-12-03 05:55:57.293424
 
2040,380,han,184,fork-aaa-project,"",user_commented_revision:e3fef0be8dc20eb1fa68fc45292d9d66de1cc67f,2012-12-03 05:56:05.503132
 
2041,380,han,184,fork-aaa-project,"",user_commented_revision:e3fef0be8dc20eb1fa68fc45292d9d66de1cc67f,2012-12-03 05:56:11.78452
 
2042,381,tmilos,265,mercurial-trunk,"",user_commented_revision:b3f0f9a39c4e1d0250048cd803ab03542d6f140a,2012-12-03 08:18:24.126434
 
2043,381,tmilos,265,mercurial-trunk,"",user_commented_revision:b3f0f9a39c4e1d0250048cd803ab03542d6f140a,2012-12-03 08:18:53.783535
 
2044,3,demo,68,aaa-project,"",user_commented_revision:0c33fa58efc5a5541d8d3f1a3d3b77367e3d94f5,2012-12-03 13:51:26.584571
 
2045,3,demo,384,aaa-test-repo2,"",user_updated_repo,2012-12-03 13:59:51.134475
 
2046,3,demo,68,aaa-project,"",user_updated_repo,2012-12-03 14:12:42.587904
 
2047,3,demo,404,Test-Repo-5,"",started_following_repo,2012-12-03 19:58:28.17924
 
2048,3,demo,404,Test-Repo-5,"",admin_created_repo,2012-12-03 19:58:28.215537
 
2049,3,demo,382,aaa-repo-fork,"",push_local:d49133c59d2b74bf5754fab639520fe0f15f660b,2012-12-03 23:45:38.954154
 
2050,5,natosha.bard,405,test-largefiles-push,"",started_following_repo,2012-12-04 14:15:02.062567
 
2051,5,natosha.bard,405,test-largefiles-push,"",admin_created_repo,2012-12-04 14:15:02.07345
 
2052,5,natosha.bard,405,test-largefiles-push,62.116.219.97,push:3055a4c8ccb9b695a7973aa25aa118b0dde122e4,2012-12-04 14:15:19.101956
 
2053,5,natosha.bard,405,test-largefiles-push,62.116.219.97,push:88adc5944c74488164ae575511429ed582a72e17,2012-12-04 14:40:10.373812
 
2054,384,test1234,406,test123456,"",started_following_repo,2012-12-04 16:07:07.967514
 
2055,384,test1234,406,test123456,"",admin_created_repo,2012-12-04 16:07:07.987393
 
2058,5,natosha.bard,408,test-repo-natosha,"",started_following_repo,2012-12-04 20:41:39.763055
 
2059,5,natosha.bard,408,test-repo-natosha,"",admin_created_repo,2012-12-04 20:41:39.775062
 
2056,5,natosha.bard,,hg,"",started_following_repo,2012-12-04 20:40:00.327829
 
2057,5,natosha.bard,,hg,"",admin_created_repo,2012-12-04 20:40:00.342796
 
2060,5,natosha.bard,,hg,"",user_deleted_repo,2012-12-04 20:42:03.236535
 
2062,5,natosha.bard,409,test-repo-natosha-fork,"",started_following_repo,2012-12-04 20:43:25.363199
 
2063,5,natosha.bard,408,test-repo-natosha,"",user_forked_repo:test-repo-natosha-fork,2012-12-04 20:43:25.413303
 
2064,5,natosha.bard,409,test-repo-natosha-fork,"",user_created_fork:test-repo-natosha-fork,2012-12-04 20:43:25.421503
 
2065,5,natosha.bard,409,test-repo-natosha-fork,62.116.219.97,"push:132a288f32d5b70a9170e504028c693cfffc5c39,fac6d36d04cb1838cd10bdcecd487567787fb853,e83c482c6c5fd60f14d1a5f5cf9b4f7b2a2eb3cb,ce2c709a8e908747376a3fda6059c1f81de321e7,45bd0cd7ca04f8cda0a61cddded8838dd312675a,35ba170c0f82dba18f0207ef4bd93216e6de8bbf,407209261f6373b4b3f35e343d1498b63263d38e,6f79c32c0bdfb304b984b5e6ba318cc63032cfa4,54cedee86e5126188b0dcfbd7015bcdca7f6c2e2,b0affcb67cba58db03ca3e443105fbaabd1bc88a,4c29668ca316422891e28c55bd794eee52823554,6180dcb29ec531c5d7457005ef142ea304ef49d8,2c63896783e31908f18088a7e9c583de6ec530bf,b3ec0b5fd7771b401392a83f47e0c2360e7f6d90,e689b0d9154605b8b04989c4fdd36e76d6cf26b8,b74361cf7c0ad6930a865e7eada13e2d2d6ed380,f94ead93406764ffd0c3febfc2ea70d36a2a28bb,848345a8d6adaa58704baecbb7567b275df3cc9d,0c10cf8191469e7c3c8844922e17e71a176cb7cb",2012-12-04 20:44:13.658236
 
2066,1,default,159,group/Test-for-code-review,"",push_local:b77f1d54f1d18c22e497f1d9d502e0d540506d21,2012-12-05 00:22:33.617864
 
2067,3,demo,410,aaa-project-fork-fork-fork-fork-fork-blah,"",started_following_repo,2012-12-05 10:07:05.333082
 
2068,3,demo,398,aaa-project-fork-fork,"",user_forked_repo:aaa-project-fork-fork-fork-fork-fork-blah,2012-12-05 10:07:05.47808
 
2069,3,demo,410,aaa-project-fork-fork-fork-fork-fork-blah,"",user_created_fork:aaa-project-fork-fork-fork-fork-fork-blah,2012-12-05 10:07:05.487482
 
2070,387,ssssss,411,sss-test,"",started_following_repo,2012-12-05 13:33:27.008097
 
2071,387,ssssss,411,sss-test,"",admin_created_repo,2012-12-05 13:33:27.018183
 
2072,387,ssssss,411,sss-test,"",user_updated_repo,2012-12-05 13:37:35.771478
 
2073,387,ssssss,411,sss-test,"",user_updated_repo,2012-12-05 13:38:00.979078
 
2074,387,ssssss,411,sss-test,"",user_updated_repo,2012-12-05 13:38:05.497667
 
2075,387,ssssss,411,sss-test,"",user_updated_repo,2012-12-05 13:38:12.513828
 
2076,387,ssssss,173,code-review-dev,"",started_following_repo,2012-12-05 13:46:51.940453
 
2077,387,ssssss,173,code-review-dev,"",stopped_following_repo,2012-12-05 13:46:54.738489
 
2078,387,ssssss,411,sss-test,109.195.177.171,push:7d42587da267871709bc82e462018b8b7d66a4a7,2012-12-05 13:59:09.546916
 
2079,387,ssssss,411,sss-test,109.195.177.171,push:bb869421c7c8f88590536d559cebd3ee5e9c3aa7,2012-12-05 14:00:27.04582
 
2080,387,ssssss,411,sss-test,"",user_updated_repo,2012-12-05 14:03:48.47955
 
2081,389,wwwwww,412,sss-test-fork,"",started_following_repo,2012-12-05 14:05:13.355226
 
2082,389,wwwwww,411,sss-test,"",user_forked_repo:sss-test-fork,2012-12-05 14:05:13.663527
 
2083,389,wwwwww,412,sss-test-fork,"",user_created_fork:sss-test-fork,2012-12-05 14:05:13.678367
 
2084,389,wwwwww,412,sss-test-fork,"",user_updated_repo,2012-12-05 14:05:56.566769
 
2085,389,wwwwww,412,sss-test-fork,109.195.177.171,push:20bd46e65a056aef107cc060d16c97b1ef2cc211,2012-12-05 14:07:21.399133
 
2086,389,wwwwww,412,sss-test-fork,"",user_commented_revision:20bd46e65a056aef107cc060d16c97b1ef2cc211,2012-12-05 14:16:56.716099
 
2087,387,ssssss,411,sss-test,"",user_updated_repo,2012-12-05 14:20:41.385001
 
2088,389,wwwwww,411,sss-test,109.195.177.171,push:20bd46e65a056aef107cc060d16c97b1ef2cc211,2012-12-05 14:20:54.878385
 
2089,387,ssssss,411,sss-test,"",user_updated_repo,2012-12-05 14:21:15.330812
 
2090,389,wwwwww,412,sss-test-fork,109.195.177.171,push:1203172be2e12aa31ec40ba4d07b75a3e17bd63f,2012-12-05 14:23:18.297453
 
2091,389,wwwwww,412,sss-test-fork,"",user_commented_revision:1203172be2e12aa31ec40ba4d07b75a3e17bd63f,2012-12-05 14:23:34.233486
 
2092,5,natosha.bard,413,natosha-repo1,"",started_following_repo,2012-12-05 16:46:55.328513
 
2093,5,natosha.bard,413,natosha-repo1,"",admin_created_repo,2012-12-05 16:46:55.342146
 
2094,5,natosha.bard,413,natosha-repo1,62.116.219.97,"push:6fbe2a2357168359aacbc524f4acd805dff72327,5787c391ba8f9d67b4e96f47d71adab79b693a30",2012-12-05 16:47:09.181828
 
2095,5,natosha.bard,414,natosha-repo1-fork,"",started_following_repo,2012-12-05 16:47:24.080447
 
2096,5,natosha.bard,413,natosha-repo1,"",user_forked_repo:natosha-repo1-fork,2012-12-05 16:47:24.101525
 
2097,5,natosha.bard,414,natosha-repo1-fork,"",user_created_fork:natosha-repo1-fork,2012-12-05 16:47:24.113866
 
2098,5,natosha.bard,414,natosha-repo1-fork,62.116.219.97,"push:a25c825fd81d069596d614efcf92505aed46227a,ac513595518923aca8b39f0a1c33c4c6e0f9d83a,d395e22e8e16373a1fffbe66b322581d69a7db17",2012-12-05 16:47:44.701535
 
2099,2,admin,38,code-review-test,"",user_commented_pull_request:73,2012-12-05 17:23:18.059481
rhodecode/tests/functional/test_admin.py
Show inline comments
 
import os
 
import csv
 
import datetime
 
from rhodecode.tests import *
 
from rhodecode.model.db import UserLog
 
from rhodecode.model.meta import Session
 
from rhodecode.lib.utils2 import safe_unicode
 

	
 
dn = os.path.dirname
 
FIXTURES = os.path.join(dn(dn(os.path.abspath(__file__))), 'fixtures')
 

	
 

	
 
class TestAdminController(TestController):
 

	
 
    @classmethod
 
    def setup_class(cls):
 
        UserLog.query().delete()
 
        Session().commit()
 
        with open(os.path.join(FIXTURES, 'journal_dump.csv')) as f:
 
            for row in csv.DictReader(f):
 
                ul = UserLog()
 
                for k, v in row.iteritems():
 
                    v = safe_unicode(v)
 
                    if k == 'action_date':
 
                        v = datetime.datetime.strptime(v, '%Y-%m-%d %H:%M:%S.%f')
 
                    setattr(ul, k, v)
 
                Session().add(ul)
 
            Session().commit()
 

	
 
    @classmethod
 
    def teardown_class(cls):
 
        UserLog.query().delete()
 
        Session().commit()
 

	
 
    def test_index(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index'))
 
        assert 'Admin journal' in response.body, 'No proper title in dashboard'
 
        # Test response...
 
        response.mustcontain('Admin journal')
 

	
 
    def test_filter_all_entries(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',))
 
        response.mustcontain('2034 entries')
 

	
 
    def test_filter_journal_filter_exact_match_on_repository(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='repository:rhodecode'))
 
        response.mustcontain('3 entries')
 

	
 
    def test_filter_journal_filter_wildcard_on_repository(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='repository:*test*'))
 
        response.mustcontain('862 entries')
 

	
 
    def test_filter_journal_filter_prefix_on_repository(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='repository:test*'))
 
        response.mustcontain('257 entries')
 

	
 
    def test_filter_journal_filter_prefix_on_repository_and_user(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='repository:test* AND username:demo'))
 
        response.mustcontain('130 entries')
 

	
 
    def test_filter_journal_filter_prefix_on_repository_or_other_repo(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='repository:test* OR repository:rhodecode'))
 
        response.mustcontain('260 entries')  # 257 + 3
 

	
 
    def test_filter_journal_filter_exact_match_on_username(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='username:demo'))
 
        response.mustcontain('1087 entries')
 

	
 
    def test_filter_journal_filter_wildcard_on_username(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='username:*test*'))
 
        response.mustcontain('100 entries')
 

	
 
    def test_filter_journal_filter_prefix_on_username(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='username:demo*'))
 
        response.mustcontain('1101 entries')
 

	
 
    def test_filter_journal_filter_prefix_on_user_or_other_user(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='username:demo OR username:volcan'))
 
        response.mustcontain('1095 entries')  # 1087 + 8
 

	
 
    def test_filter_journal_filter_wildcard_on_action(self):
 
        self.log_user()
 
        response = self.app.get(url(controller='admin/admin', action='index',
 
                                    filter='action:*pull_request*'))
 
        response.mustcontain('187 entries')
 
\ No newline at end of file
0 comments (0 inline, 0 general)