diff --git a/media/css/seahub.css b/media/css/seahub.css index 3640f0eaa6..ed3fceeba9 100644 --- a/media/css/seahub.css +++ b/media/css/seahub.css @@ -277,6 +277,21 @@ table img { font-size:16px; margin-bottom:14px; } +.lsch { + font-size:12px; + color:#666; + text-decoration:underline; +} +#ls-ch {/*repo commit details container*/ + min-width:300px; + min-height:300px; + max-width:850px; + max-height:550px; + overflow:auto; +} +#ls-ch ul { + padding:0 0 6px 0; +} /*repo-share-form*/ #to_email, #added-member-name { diff --git a/po.py b/po.py index de554687b5..67a4486056 100644 --- a/po.py +++ b/po.py @@ -9,5 +9,8 @@ TRANSLATION_MAP = { 'and' : u'以及另外', 'more files' : u'个文件', 'Reverted repo to status at' : u'同步目录内容还原到', + 'Merged ' : u'合并了', + '\'s changes' : u' 的修改', + 'other' : u'其他人', 'Merged others\' changes' : u'合并了其他人的修改', } diff --git a/templates/repo_history.html b/templates/repo_history.html index 8b272820f3..51fc69bbda 100644 --- a/templates/repo_history.html +++ b/templates/repo_history.html @@ -25,7 +25,12 @@ {% else %} 未知 {% endif %} - {{ commit.props.desc|translate_commit_desc }} + + {{ commit.props.desc|translate_commit_desc }} + {% if not forloop.last %} + 详情 + {% endif %} + {% if not forloop.last %} 浏览 @@ -63,10 +68,57 @@ 100 {% endif %} + +
{% endblock %} {% block extra_script %} + +addConfirmTo($(".repo-revert"), '确定要还原该目录?'); {% endblock %} diff --git a/urls.py b/urls.py index 13980d1129..377bde5185 100644 --- a/urls.py +++ b/urls.py @@ -8,7 +8,7 @@ from seahub.views import root, peers, myhome, \ ownerhome, remove_fetched_repo, repo_history_dir, repo_history_revert, \ user_info, repo_set_access_property, repo_access_file, \ repo_add_share, repo_list_share, repo_remove_share, repo_download, \ - seafile_access_check, back_local, group_admin + seafile_access_check, back_local, group_admin, repo_history_changes # Uncomment the next two lines to enable the admin: #from django.contrib import admin @@ -41,6 +41,7 @@ urlpatterns = patterns('', (r'^repo/history/dir/(?P[^/]+)/$', repo_history_dir), (r'^repo/history/revert/(?P[^/]+)/$', repo_history_revert), # (r'^repo/token/modify/(?P[^/]+)/$', modify_token), + (r'^repo/history/changes/(?P[^/]+)/$', repo_history_changes), (r'^repo/remove/(?P[^/]+)/$', remove_repo), # (r'^repo/removefetched/(?P[^/]+)/(?P[^/]+)/$', remove_fetched_repo), (r'^repo/setap/(?P[^/]+)/$', repo_set_access_property), diff --git a/views.py b/views.py index 1f201bdcb4..5be70ab53e 100644 --- a/views.py +++ b/views.py @@ -1,6 +1,7 @@ # encoding: utf-8 import settings import stat +import simplejson as json from urllib import quote from django.core.urlresolvers import reverse from django.db import IntegrityError @@ -425,6 +426,88 @@ def repo_history_revert(request, repo_id): return go_error(request, u'未知错误') return HttpResponseRedirect(reverse(repo_history, args=[repo_id])) + +def get_filename(start, ent): + i = start + 1 + lenidx = start - 1 + while i <= len(ent): + tmp = " ".join(ent[start:i]) + if len(tmp) == int(ent[lenidx]): + return (tmp, i) + i = i + 1 + return ("", 0) + +def add_to_status_list(lists, status_ent): + if status_ent[1] == 'A': + filename, index = get_filename(4, status_ent) + lists['new'].append(filename) + elif status_ent[1] == 'D': + filename, index = get_filename(4, status_ent) + lists['removed'].append(filename) + elif status_ent[1] == 'R': + filename1, index1 = get_filename(4, status_ent) + filename2, index2 = get_filename(index1 + 1, status_ent) + lists['renamed'].append(filename1 + u' 被移动到 ' + filename2) + elif status_ent[1] == 'M': + filename, index = get_filename(4, status_ent) + lists['modified'].append(filename) + +def get_diff(repo_id, arg1, arg2): + lists = {'new' : [], 'removed' : [], 'renamed' : [], 'modified' : []} + + diff_result = seafserv_threaded_rpc.get_diff(repo_id, arg1, arg2) + if diff_result == "": + return lists; + + diff_result = diff_result[:len(diff_result)-1] + + for d in diff_result.split("\n"): + tmp = d.split(" ") + if tmp[0] == 'C': + add_to_status_list(lists, tmp) + + return lists + +def repo_history_changes(request, repo_id): + changes = {} + content_type = 'application/json; charset=utf-8' + + repo_ap = seafserv_threaded_rpc.repo_query_access_property(repo_id) + if repo_ap == None: + repo_ap = 'own' + + if not access_to_repo(request, repo_id, repo_ap): + return HttpResponse(json.dumps(changes), + content_type=content_type) + + repo = get_repo(repo_id) + if not repo: + return HttpResponse(json.dumps(changes), + content_type=content_type) + + password_set = False + if repo.props.encrypted: + try: + ret = seafserv_rpc.is_passwd_set(repo_id, request.user.username) + if ret == 1: + password_set = True + except: + return HttpResponse(json.dumps(changes), + content_type=content_type) + + if repo.props.encrypted and not password_set: + return HttpResponse(json.dumps(changes), + content_type=content_type) + + commit_id = request.GET.get('commit_id', '') + if not commit_id: + return HttpResponse(json.dumps(changes), + content_type=content_type) + + changes = get_diff(repo_id, '', commit_id) + + return HttpResponse(json.dumps(changes), + content_type=content_type) @login_required def modify_token(request, repo_id):