svn_record 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +72 -0
  3. data/Rakefile +7 -0
  4. data/app/assets/images/svn_record/file_icon/bullet_add.png +0 -0
  5. data/app/assets/images/svn_record/file_icon/bullet_black.png +0 -0
  6. data/app/assets/images/svn_record/file_icon/bullet_blue.png +0 -0
  7. data/app/assets/images/svn_record/file_icon/bullet_delete.png +0 -0
  8. data/app/assets/images/svn_record/file_icon/bullet_diamond.png +0 -0
  9. data/app/assets/images/svn_record/file_icon/bullet_end.png +0 -0
  10. data/app/assets/images/svn_record/file_icon/bullet_go.png +0 -0
  11. data/app/assets/images/svn_record/file_icon/bullet_orange.png +0 -0
  12. data/app/assets/images/svn_record/file_icon/bullet_purple.png +0 -0
  13. data/app/assets/images/svn_record/file_icon/bullet_toggle_minus.png +0 -0
  14. data/app/assets/images/svn_record/file_icon/bullet_toggle_plus.png +0 -0
  15. data/app/assets/images/svn_record/file_icon/dir.png +0 -0
  16. data/app/assets/images/svn_record/file_icon/file.png +0 -0
  17. data/app/assets/images/svn_record/file_icon/folder.png +0 -0
  18. data/app/assets/images/svn_record/file_icon/folder_open.png +0 -0
  19. data/app/assets/images/svn_record/file_icon/folder_open_add.png +0 -0
  20. data/app/assets/images/svn_record/file_icon/folder_open_orange.png +0 -0
  21. data/app/assets/javascripts/svn_record/application.js +16 -0
  22. data/app/assets/javascripts/svn_record/change.js.coffee +4 -0
  23. data/app/assets/stylesheets/svn_record/application.css +14 -0
  24. data/app/assets/stylesheets/svn_record/site.css +396 -0
  25. data/app/controllers/svn_record/application_controller.rb +3 -0
  26. data/app/controllers/svn_record/repository/application_controller.rb +3 -0
  27. data/app/controllers/svn_record/repository/changes_controller.rb +38 -0
  28. data/app/models/svn_record/repository/change.rb +39 -0
  29. data/app/models/svn_record/repository/file.rb +20 -0
  30. data/app/models/svn_record/repository/user.rb +14 -0
  31. data/app/views/layouts/svn_record/subversion.html.slim +22 -0
  32. data/app/views/svn_record/repository/changes/_changesets_list.slim +29 -0
  33. data/app/views/svn_record/repository/changes/diff.html.slim +30 -0
  34. data/app/views/svn_record/repository/changes/entry.html.slim +18 -0
  35. data/app/views/svn_record/repository/changes/index.html.slim +34 -0
  36. data/app/views/svn_record/repository/changes/list.html.slim +2 -0
  37. data/app/views/svn_record/repository/changes/revisions.html.slim +18 -0
  38. data/config/configuration.yml +5 -0
  39. data/config/routes.rb +17 -0
  40. data/lib/Svn/helper.rb +108 -0
  41. data/lib/Svn/mime_type.rb +492 -0
  42. data/lib/Svn/scm/adapters/subversion.rb +303 -0
  43. data/lib/generators/svn_record/install_generator.rb +16 -0
  44. data/lib/generators/svn_record/templates/create_repository_changes.rb +17 -0
  45. data/lib/generators/svn_record/templates/create_repository_files.rb +21 -0
  46. data/lib/generators/svn_record/templates/create_repository_user.rb +8 -0
  47. data/lib/svn_record/engine.rb +11 -0
  48. data/lib/svn_record/version.rb +3 -0
  49. data/lib/svn_record.rb +4 -0
  50. metadata +161 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3a5caf8caca640dc82c23d1b1c6e19fb9cbd6be0
4
+ data.tar.gz: 67c77c4704ba61572783f7a69f961ba7a64b67c8
5
+ SHA512:
6
+ metadata.gz: e2252b540fb80e712a99bad30caae0d89b3d90ab773524d4a6b082988f4ab20c6c8f60c861ef575ecd31ef774faf23f9c6cbfbc4f3763b01120cbbcf4953fa97
7
+ data.tar.gz: e56658a1df1152534cdb8c2c6c296ad767a280a46164a5b6c6d785a0f65c30db9788410a6ca32d5f45990ad5c7ff7fbe0766e15fc5ce7008719d93afa9233754
data/README.md ADDED
@@ -0,0 +1,72 @@
1
+
2
+ ### 安装
3
+
4
+ 1.添加Gemfile 文件代码如下
5
+
6
+ gem 'svn_record'
7
+
8
+ 2.执行命令
9
+
10
+ rails g svn_record:install
11
+
12
+ 3.添加脚本文件 application.js
13
+
14
+ //= require svn_record/change
15
+
16
+ 4.添加样式文件 application.cs
17
+
18
+ *= require svn_record/site
19
+
20
+ 5.连接svn配置文件
21
+
22
+ config/configuration.yml
23
+
24
+
25
+ ### 访问页面
26
+ 运行后访问地址
27
+
28
+ http://localhost:3000/repository/changes
29
+
30
+ ### 国际化参考格式
31
+
32
+ datetime:
33
+ distance_in_words:
34
+ half_a_minute: "半分钟"
35
+ less_than_x_seconds:
36
+ one: "一秒内"
37
+ other: "少于 %{count} 秒"
38
+ x_seconds:
39
+ one: "一秒"
40
+ other: "%{count} 秒"
41
+ less_than_x_minutes:
42
+ one: "一分钟内"
43
+ other: "少于 %{count} 分钟"
44
+ x_minutes:
45
+ one: "一分钟"
46
+ other: "%{count} 分钟"
47
+ about_x_hours:
48
+ one: "大约一小时"
49
+ other: "大约 %{count} 小时"
50
+ x_hours:
51
+ one: "1 小时"
52
+ other: "%{count} 小时"
53
+ x_days:
54
+ one: "一天"
55
+ other: "%{count} 天"
56
+ about_x_months:
57
+ one: "大约一个月"
58
+ other: "大约 %{count} 个月"
59
+ x_months:
60
+ one: "一个月"
61
+ other: "%{count} 个月"
62
+ about_x_years:
63
+ one: "大约一年"
64
+ other: "大约 %{count} 年"
65
+ over_x_years:
66
+ one: "超过一年"
67
+ other: "超过 %{count} 年"
68
+ almost_x_years:
69
+ one: "将近 1 年"
70
+ other: "将近 %{count} 年"
71
+
72
+
data/Rakefile ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env rake
2
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
3
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
+
5
+ require File.expand_path('../config/application', __FILE__)
6
+
7
+ SvnRecord::Application.load_tasks
@@ -0,0 +1,16 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // the compiled file.
9
+ //
10
+ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
11
+ // GO AFTER THE REQUIRES BELOW.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require_tree .
16
+ //= require change
@@ -0,0 +1,4 @@
1
+ jQuery ($) ->
2
+ $('.contextual .toggle_code').click ->
3
+ $('.contextual .autoscroll').toggle('sile')
4
+ return false
@@ -0,0 +1,14 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ *
5
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
9
+ * compiled file, but it's generally better to create a new file per style scope.
10
+ *
11
+ *= require_self
12
+ *= require_tree .
13
+ *= require site
14
+ */
@@ -0,0 +1,396 @@
1
+ html {overflow-y:scroll;}
2
+ body { font-family: Verdana, sans-serif; font-size: 12px; color:#484848; margin: 0; padding: 0; min-width: 900px; }
3
+ a{text-decoration:none;}
4
+ h1, h2, h3, h4 {font-family: "Trebuchet MS", Verdana, sans-serif;padding: 2px 10px 1px 0px;margin: 0 0 10px 0;}
5
+ #content h1, h2, h3, h4 {color: #555;}
6
+ h2, .wiki h1 {font-size: 20px;}
7
+ h3, .wiki h2 {font-size: 16px;}
8
+ h4, .wiki h3 {font-size: 13px;}
9
+ h4 {border-bottom: 1px dotted #bbb;}
10
+
11
+ /***** Layout *****/
12
+ #wrapper {background: white;}
13
+ #top-menu {background: #3E5B76; color: #fff; height:1.8em; font-size: 0.8em; padding: 2px 2px 0px 6px;}
14
+ #top-menu ul {margin: 0; padding: 0;}
15
+ #top-menu li {
16
+ float:left;
17
+ list-style-type:none;
18
+ margin: 0px 0px 0px 0px;
19
+ padding: 0px 0px 0px 0px;
20
+ white-space:nowrap;
21
+ }
22
+ #top-menu a {color: #fff; margin-right: 8px; font-weight: bold;}
23
+ #top-menu #loggedas { float: right; margin-right: 0.5em; color: #fff; }
24
+
25
+ #account {float:right;}
26
+
27
+ #header {min-height:5.3em;margin:0;background-color:#628DB6;color:#f8f8f8; padding: 4px 8px 20px 6px; position:relative;}
28
+ #header a {color:#f8f8f8;}
29
+ #header h1 a.ancestor { font-size: 80%; }
30
+ #quick-search {float:right;}
31
+
32
+ #main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
33
+ #main-menu ul {margin: 0; padding: 0;}
34
+ #main-menu li {
35
+ float:left;
36
+ list-style-type:none;
37
+ margin: 0px 2px 0px 0px;
38
+ padding: 0px 0px 0px 0px;
39
+ white-space:nowrap;
40
+ }
41
+ #main-menu li a {
42
+ display: block;
43
+ color: #fff;
44
+ text-decoration: none;
45
+ font-weight: bold;
46
+ margin: 0;
47
+ padding: 4px 10px 4px 10px;
48
+ }
49
+ #main-menu li a:hover {background:#759FCF; color:#fff;}
50
+ #main-menu li a.selected, #main-menu li a.selected:hover {background:#fff; color:#555;}
51
+
52
+ #admin-menu ul {margin: 0; padding: 0;}
53
+ #admin-menu li {margin: 0; padding: 0 0 6px 0; list-style-type:none;}
54
+
55
+ #main {background-color:#EEEEEE;}
56
+ .contextual {white-space: nowrap; line-height:1.4em;margin-top:5px; padding-left: 10px; font-size:0.9em;}
57
+ .contextual input, .contextual select {font-size:0.9em;}
58
+ .message .contextual { margin-top: 0; }
59
+
60
+ #sidebar{ float: right; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;}
61
+ * html #sidebar{ width: 22%; }
62
+ #sidebar h3{ font-size: 14px; margin-top:14px; color: #666; }
63
+ #sidebar hr{ width: 100%; margin: 0 auto; height: 1px; background: #ccc; border: 0; }
64
+ * html #sidebar hr{ width: 95%; position: relative; left: -6px; color: #ccc; }
65
+ #sidebar .contextual { margin-right: 1em; }
66
+ #sidebar ul {margin: 0; padding: 0;}
67
+ #sidebar ul li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;}
68
+
69
+ #content { width: 75%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
70
+ * html #content{ width: 75%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
71
+ html>body #content { }
72
+ * html body #content { height: 600px; } /* IE */
73
+
74
+ #main.nosidebar #sidebar{ display: none; }
75
+ #main.nosidebar #content{ width: auto; border-right: 0; }
76
+
77
+ #footer {clear: both; border-top: 1px solid #bbb; font-size: 0.9em; color: #aaa; padding: 5px; text-align:center; background:#fff;}
78
+
79
+
80
+ /***** Tables *****/
81
+ table.list { border: 1px solid #e4e4e4; border-collapse: collapse; width: 100%; margin-bottom: 4px; }
82
+ table.list th { background-color:#EEEEEE; padding: 4px; white-space:nowrap; }
83
+ table.list td { vertical-align: top; padding-right:10px; text-align: center; }
84
+ table.list td.id { width: 2%; text-align: center;}
85
+ table.list td.checkbox { width: 15px; padding: 2px 0 0 0; }
86
+ table.list td.checkbox input {padding:0px;}
87
+ table.list td.buttons { width: 15%; white-space:nowrap; text-align: right; }
88
+ table.list td.buttons a { padding-right: 0.6em; }
89
+ table.list caption { text-align: left; padding: 0.5em 0.5em 0.5em 0; }
90
+
91
+ tr.version.closed, tr.version.closed a { color: #999; }
92
+ tr.version td.name { padding-left: 20px; }
93
+ tr.version.shared td.name { background: url(file_icon/link.png) no-repeat 0% 70%; }
94
+ tr.version td.date, tr.version td.status, tr.version td.sharing { text-align: center; white-space:nowrap; }
95
+
96
+ tr.user td { width:13%; }
97
+ tr.user td.email { width:18%; }
98
+ tr.user td { white-space: nowrap; }
99
+ tr.user.locked, tr.user.registered { color: #aaa; }
100
+ tr.user.locked a, tr.user.registered a { color: #aaa; }
101
+
102
+ table.permissions td.role {color:#999;font-size:90%;font-weight:normal !important;text-align:center;vertical-align:bottom;}
103
+
104
+ tr.wiki-page-version td.updated_on, tr.wiki-page-version td.author {text-align:center;}
105
+
106
+ tr.time-entry { text-align: center; white-space: nowrap; }
107
+ tr.time-entry td.issue, tr.time-entry td.comments { text-align: left; white-space: normal; }
108
+ td.hours { text-align: right; font-weight: bold; padding-right: 0.5em; }
109
+ td.hours .hours-dec { font-size: 0.9em; }
110
+
111
+
112
+ table.list tbody tr.group td { padding: 0.8em 0 0.5em 0.3em; font-weight: bold; border-bottom: 1px solid #ccc; }
113
+ table.list tbody tr.group span.count {position:relative; top:-1px; color:#fff; font-size:10px; background:#9DB9D5; padding:0px 6px 1px 6px; border-radius:3px; margin-left:4px;}
114
+ tr.group a.toggle-all { color: #aaa; font-size: 80%; font-weight: normal; display:none;}
115
+ tr.group:hover a.toggle-all { display:inline;}
116
+ a.toggle-all:hover {text-decoration:none;}
117
+
118
+ table.list tbody tr:hover { background-color:#ffffdd; }
119
+ table.list tbody tr.group:hover { background-color:inherit; }
120
+ table td {padding:2px;}
121
+ table p {margin:0;}
122
+ .odd {background-color:#f6f7f8;}
123
+ .even {background-color: #fff;}
124
+
125
+ a.sort { padding-right: 16px; background-position: 100% 50%; background-repeat: no-repeat; }
126
+ a.sort.asc { background-image: url(file_icon/sort_asc.png); }
127
+ a.sort.desc { background-image: url(file_icon/sort_desc.png); }
128
+
129
+ table.attributes { width: 100% }
130
+ table.attributes th { vertical-align: top; text-align: left; }
131
+ table.attributes td { vertical-align: top; }
132
+
133
+ table.boards a.board, h3.comments { background: url(file_icon/comment.png) no-repeat 0% 50%; padding-left: 20px; }
134
+ table.boards td.topic-count, table.boards td.message-count {text-align:center;}
135
+ table.boards td.last-message {font-size:80%;}
136
+
137
+ table.messages td.author, table.messages td.created_on, table.messages td.reply-count {text-align:center;}
138
+
139
+ table.query-columns {
140
+ border-collapse: collapse;
141
+ border: 0;
142
+ }
143
+
144
+ td.radio_span{
145
+ float: none;
146
+ width: 50px;
147
+ }
148
+ span.float_left{
149
+ float: left;
150
+ }
151
+ span.float_right{
152
+ float: right;
153
+ }
154
+
155
+
156
+ table.filecontent { border: 1px solid #e2e2e2; border-collapse: collapse; width:98%; background-color: #fafafa; }
157
+ table.filecontent tbody {font-family:"Liberation Mono", Courier, monospace; font-size:12px;}
158
+ table.filecontent th { border: 1px solid #e2e2e2; background-color: #eee; }
159
+ table.filecontent th.filename { background-color: #e4e4d4; text-align: left; padding:5px;}
160
+ table.filecontent tr.spacing th { text-align:center; }
161
+ table.filecontent tr.spacing td { height: 0.4em; background: #EAF2F5;}
162
+ table.filecontent th.line-num {
163
+ border: 1px solid #e2e2e2;
164
+ text-align: right;
165
+ width: 2%;
166
+ padding: 0 3px 0 0;
167
+ color: #999;
168
+ user-select: none;
169
+ -moz-user-select: none;
170
+ -o-user-select: none;
171
+ -ms-user-select: none;
172
+ -webkit-user-select: none;
173
+ font-weight:normal;
174
+ }
175
+ table.filecontent th.line-num a {
176
+ text-decoration: none;
177
+ color: inherit;
178
+ }
179
+ table.filecontent td.line-code {padding: 0 0 0 4px;}
180
+ table.filecontent td.line-code pre {
181
+ margin: 0px;
182
+ white-space: pre-wrap;
183
+ font-family:"Liberation Mono", Courier, monospace; font-size:12px;
184
+ }
185
+
186
+
187
+ /***** Diff *****/
188
+ .diff_out { background: #fcc; }
189
+ .diff_out span { background: #faa; }
190
+ .diff_in { background: #cfc; }
191
+ .diff_in span { background: #afa; }
192
+
193
+ .text-diff {
194
+ padding: 1em;
195
+ background-color:#f6f6f6;
196
+ color:#505050;
197
+ border: 1px solid #e4e4e4;
198
+ }
199
+
200
+
201
+ table.revision-info td {
202
+ margin: 0px;
203
+ padding: 0px;
204
+ }
205
+
206
+ div.revision-graph { position: absolute; min-width: 1px; }
207
+
208
+ div.changeset-changes ul { margin: 0; padding: 0; }
209
+ div.changeset-changes ul > ul { margin-left: 18px; padding: 0; }
210
+
211
+ li.change {
212
+ list-style-type:none;
213
+ background-image: url(file_icon/bullet_black.png);
214
+ background-position: 1px 1px;
215
+ background-repeat: no-repeat;
216
+ padding-top: 1px;
217
+ padding-bottom: 1px;
218
+ padding-left: 20px;
219
+ margin: 0;
220
+ }
221
+ li.change.folder { background-image: url(file_icon/folder_open.png); }
222
+ li.change.folder.change-A { background-image: url(file_icon/folder_open_add.png); }
223
+ li.change.folder.change-M { background-image: url(file_icon/folder_open_orange.png); }
224
+ li.change.change-A { background-image: url(file_icon/bullet_add.png); }
225
+ li.change.change-M { background-image: url(file_icon/bullet_orange.png); }
226
+ li.change.change-C { background-image: url(file_icon/bullet_blue.png); }
227
+ li.change.change-R { background-image: url(file_icon/bullet_purple.png); }
228
+ li.change.change-D { background-image: url(file_icon/bullet_delete.png); }
229
+
230
+ li.change .copied-from { font-style: italic; color: #999; font-size: 0.9em; }
231
+ li.change .copied-from:before { content: " - "}
232
+
233
+ #changes-legend { float: right; font-size: 0.8em; margin: 0; }
234
+ #changes-legend li { float: left; background-position: 5px 0; }
235
+
236
+ table.filecontent { border: 1px solid #e2e2e2; border-collapse: collapse; width:98%; background-color: #fafafa; }
237
+ table.filecontent tbody {font-family:"Liberation Mono", Courier, monospace; font-size:12px;}
238
+ table.filecontent th { border: 1px solid #e2e2e2; background-color: #eee; }
239
+ table.filecontent th.filename { background-color: #e4e4d4; text-align: left; padding:5px;}
240
+ table.filecontent tr.spacing th { text-align:center; }
241
+ table.filecontent tr.spacing td { height: 0.4em; background: #EAF2F5;}
242
+ table.list td.filename{ padding-left: 100px !important ; text-align: left; width: 200px}
243
+ table.list td.comments{ text-align: left}
244
+ table.filecontent th.line-num {
245
+ border: 1px solid #e2e2e2;
246
+ text-align: right;
247
+ width: 2%;
248
+ padding: 0 3px 0 0;
249
+ color: #999;
250
+ user-select: none;
251
+ -moz-user-select: none;
252
+ -o-user-select: none;
253
+ -ms-user-select: none;
254
+ -webkit-user-select: none;
255
+ font-weight:normal;
256
+ }
257
+ table.filecontent th.line-num a {
258
+ text-decoration: none;
259
+ color: inherit;
260
+ }
261
+ table.filecontent td.line-code {padding: 0 0 0 4px;}
262
+ table.filecontent td.line-code pre {
263
+ margin: 0px;
264
+ white-space: pre-wrap;
265
+ font-family:"Liberation Mono", Courier, monospace; font-size:12px;
266
+ }
267
+
268
+ /* 12 different colors for the annonate view */
269
+ table.annotate tr.bloc-0 {background: #FFFFBF;}
270
+ table.annotate tr.bloc-1 {background: #EABFFF;}
271
+ table.annotate tr.bloc-2 {background: #BFFFFF;}
272
+ table.annotate tr.bloc-3 {background: #FFD9BF;}
273
+ table.annotate tr.bloc-4 {background: #E6FFBF;}
274
+ table.annotate tr.bloc-5 {background: #BFCFFF;}
275
+ table.annotate tr.bloc-6 {background: #FFBFEF;}
276
+ table.annotate tr.bloc-7 {background: #FFE6BF;}
277
+ table.annotate tr.bloc-8 {background: #FFE680;}
278
+ table.annotate tr.bloc-9 {background: #AA80FF;}
279
+ table.annotate tr.bloc-10 {background: #FFBFDC;}
280
+ table.annotate tr.bloc-11 {background: #BFE4FF;}
281
+
282
+ table.annotate td.revision {
283
+ padding:0;
284
+ text-align: center;
285
+ width: 2%;
286
+ padding-left: 1em;
287
+ background: inherit;
288
+ }
289
+
290
+ table.annotate td.author {
291
+ padding:0;
292
+ text-align: center;
293
+ border-right: 1px solid #d7d7d7;
294
+ white-space: nowrap;
295
+ padding-left: 1em;
296
+ padding-right: 1em;
297
+ width: 3%;
298
+ background: inherit;
299
+ }
300
+
301
+ table.annotate td.line-code { background-color: #fafafa; }
302
+
303
+ div.action_M { background: #fd8 }
304
+ div.action_D { background: #f88 }
305
+ div.action_A { background: #bfb }
306
+ /************* CodeRay styles *************/
307
+ .syntaxhl div {display: inline;}
308
+ .syntaxhl .line-numbers {padding: 2px 4px 2px 4px; background-color: #eee; margin:0px 5px 0px 0px;}
309
+ .syntaxhl .code pre { overflow: auto }
310
+ .syntaxhl .debug { color: white !important; background: blue !important; }
311
+
312
+ .syntaxhl .annotation { color:#007 }
313
+ .syntaxhl .attribute-name { color:#b48 }
314
+ .syntaxhl .attribute-value { color:#700 }
315
+ .syntaxhl .binary { color:#509 }
316
+ .syntaxhl .char .content { color:#D20 }
317
+ .syntaxhl .char .delimiter { color:#710 }
318
+ .syntaxhl .char { color:#D20 }
319
+ .syntaxhl .class { color:#258; font-weight:bold }
320
+ .syntaxhl .class-variable { color:#369 }
321
+ .syntaxhl .color { color:#0A0 }
322
+ .syntaxhl .comment { color:#385 }
323
+ .syntaxhl .comment .char { color:#385 }
324
+ .syntaxhl .comment .delimiter { color:#385 }
325
+ .syntaxhl .complex { color:#A08 }
326
+ .syntaxhl .constant { color:#258; font-weight:bold }
327
+ .syntaxhl .decorator { color:#B0B }
328
+ .syntaxhl .definition { color:#099; font-weight:bold }
329
+ .syntaxhl .delimiter { color:black }
330
+ .syntaxhl .directive { color:#088; font-weight:bold }
331
+ .syntaxhl .doc { color:#970 }
332
+ .syntaxhl .doc-string { color:#D42; font-weight:bold }
333
+ .syntaxhl .doctype { color:#34b }
334
+ .syntaxhl .entity { color:#800; font-weight:bold }
335
+ .syntaxhl .error { color:#F00; background-color:#FAA }
336
+ .syntaxhl .escape { color:#666 }
337
+ .syntaxhl .exception { color:#C00; font-weight:bold }
338
+ .syntaxhl .float { color:#06D }
339
+ .syntaxhl .function { color:#06B; font-weight:bold }
340
+ .syntaxhl .global-variable { color:#d70 }
341
+ .syntaxhl .hex { color:#02b }
342
+ .syntaxhl .imaginary { color:#f00 }
343
+ .syntaxhl .include { color:#B44; font-weight:bold }
344
+ .syntaxhl .inline { background-color: hsla(0,0%,0%,0.07); color: black }
345
+ .syntaxhl .inline-delimiter { font-weight: bold; color: #666 }
346
+ .syntaxhl .instance-variable { color:#33B }
347
+ .syntaxhl .integer { color:#06D }
348
+ .syntaxhl .key .char { color: #60f }
349
+ .syntaxhl .key .delimiter { color: #404 }
350
+ .syntaxhl .key { color: #606 }
351
+ .syntaxhl .keyword { color:#939; font-weight:bold }
352
+ .syntaxhl .label { color:#970; font-weight:bold }
353
+ .syntaxhl .local-variable { color:#963 }
354
+ .syntaxhl .namespace { color:#707; font-weight:bold }
355
+ .syntaxhl .octal { color:#40E }
356
+ .syntaxhl .operator { }
357
+ .syntaxhl .predefined { color:#369; font-weight:bold }
358
+ .syntaxhl .predefined-constant { color:#069 }
359
+ .syntaxhl .predefined-type { color:#0a5; font-weight:bold }
360
+ .syntaxhl .preprocessor { color:#579 }
361
+ .syntaxhl .pseudo-class { color:#00C; font-weight:bold }
362
+ .syntaxhl .regexp .content { color:#808 }
363
+ .syntaxhl .regexp .delimiter { color:#404 }
364
+ .syntaxhl .regexp .modifier { color:#C2C }
365
+ .syntaxhl .regexp { background-color:hsla(300,100%,50%,0.06); }
366
+ .syntaxhl .reserved { color:#080; font-weight:bold }
367
+ .syntaxhl .shell .content { color:#2B2 }
368
+ .syntaxhl .shell .delimiter { color:#161 }
369
+ .syntaxhl .shell { background-color:hsla(120,100%,50%,0.06); }
370
+ .syntaxhl .string .char { color: #46a }
371
+ .syntaxhl .string .content { color: #46a }
372
+ .syntaxhl .string .delimiter { color: #46a }
373
+ .syntaxhl .string .modifier { color: #46a }
374
+ .syntaxhl .symbol .content { color:#d33 }
375
+ .syntaxhl .symbol .delimiter { color:#d33 }
376
+ .syntaxhl .symbol { color:#d33 }
377
+ .syntaxhl .tag { color:#070 }
378
+ .syntaxhl .type { color:#339; font-weight:bold }
379
+ .syntaxhl .value { color: #088; }
380
+ .syntaxhl .variable { color:#037 }
381
+
382
+ .syntaxhl .insert { background: hsla(120,100%,50%,0.12) }
383
+ .syntaxhl .delete { background: hsla(0,100%,50%,0.12) }
384
+ .syntaxhl .change { color: #bbf; background: #007; }
385
+ .syntaxhl .head { color: #f8f; background: #505 }
386
+ .syntaxhl .head .filename { color: white; }
387
+
388
+ .syntaxhl .delete .eyecatcher { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; }
389
+ .syntaxhl .insert .eyecatcher { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; }
390
+
391
+ .syntaxhl .insert .insert { color: #0c0; background:transparent; font-weight:bold }
392
+ .syntaxhl .delete .delete { color: #c00; background:transparent; font-weight:bold }
393
+ .syntaxhl .change .change { color: #88f }
394
+ .syntaxhl .head .head { color: #f4f }
395
+
396
+ td.radio_span {text-align: left !important;}
@@ -0,0 +1,3 @@
1
+ class SvnRecord::ApplicationController < ActionController::Base
2
+ protect_from_forgery
3
+ end
@@ -0,0 +1,3 @@
1
+ class SvnRecord::Develop::Repository::ApplicationController < Develop::ApplicationController
2
+
3
+ end
@@ -0,0 +1,38 @@
1
+ class SvnRecord::Repository::ChangesController < SvnRecord::Repository::ApplicationController
2
+ layout 'svn_record/subversion'
3
+ before_filter :find_repository_params
4
+ def index
5
+ SvnRecord::Repository::Change.scm.fetch_changesets unless @path.present?
6
+ @entries = SvnRecord::Repository::Change.scm.entries(@path)
7
+ @changesets = SvnRecord::Repository::Change.fetch_revisions(@entries).limit(10)
8
+ rescue
9
+ render text: '请检查SVN配置以及安装过程是否有问题'
10
+ end
11
+
12
+ def list
13
+ @entries = SvnRecord::Repository::Change.scm.entries(@path)
14
+ @changesets = SvnRecord::Repository::Change.fetch_revisions(@entries)
15
+ end
16
+
17
+ def entry
18
+ @content = SvnRecord::Repository::Change.scm.cat(@path, params[:rev])
19
+ @changesets = SvnRecord::Repository::Change.revisions(@path)
20
+ end
21
+
22
+ def revisions
23
+ @changeset = SvnRecord::Repository::Change.find_by_revision(params[:id])
24
+ end
25
+
26
+ def diff
27
+ @diff = SvnRecord::Repository::Change.scm.diff(@path, params[:rev], params[:rev_to])
28
+ end
29
+
30
+ protected
31
+
32
+ def find_repository_params
33
+ @root_name = SvnRecord::Repository::Change.scm.root_name
34
+ @path = params[:path].to_s
35
+ end
36
+
37
+
38
+ end
@@ -0,0 +1,39 @@
1
+ ##
2
+ # = 版本 修订 表
3
+ #
4
+ # == Fields
5
+ #
6
+ # user_id :: 用户ID
7
+ # revision :: 版本号
8
+ # committer :: 提交人
9
+ # comment :: 注释
10
+ # committed_at :: 提交时间
11
+ #
12
+ # == Indexessu
13
+ #
14
+
15
+ class SvnRecord::Repository::Change < ActiveRecord::Base
16
+ self.table_name = 'repository_changes'
17
+ include Svn::Scm::Adapters
18
+ attr_accessible :revision, :committer, :comment, :committed_at, :user_id
19
+ has_many :files
20
+ belongs_to :user
21
+ scope :committed_desc, order('revision DESC')
22
+
23
+ def self.scm
24
+ Subversion.new
25
+ end
26
+
27
+ def self.fetch_revisions(entries)
28
+ where("revision <= ?", entries.map(&:lastrev).map{|lastrev| lastrev.identifier.to_i}.max).order("id DESC")
29
+ end
30
+
31
+ def self.revisions(path)
32
+ where(revision: scm.revisions(path).map(&:identifier)).reorder('id')
33
+ end
34
+
35
+ def create_change(options, branch = "")
36
+ SvnRecord::Repository::File.create(options.update(change_id: self.id,revision: self.revision, branch: branch))
37
+ end
38
+ end
39
+
@@ -0,0 +1,20 @@
1
+ ##
2
+ # = 版本 文件 表
3
+ #
4
+ # == Fields
5
+ #
6
+ # change_id :: 修订ID
7
+ # action :: 状态 可为=> %w[A C D I M R X]
8
+ # path :: 目录
9
+ # from_path :: 目录来源
10
+ # from_revision :: 版本来源
11
+ # revision :: 版本号
12
+ # branch :: 分支
13
+ #
14
+ # == Indexes
15
+ #
16
+
17
+ class SvnRecord::Repository::File < ActiveRecord::Base
18
+ self.table_name = "repository_files"
19
+ attr_accessible :change_id, :action, :path, :from_path, :from_revision, :revision, :branch, :change
20
+ end