"
+ exit 2
+fi
+
+ # We need to handle different source repository types separately.
+ #
+ # The convert extension cannot convert directly from a remote git
+ # repo; we'd have to mirror to a local repo first. Incremental
+ # conversions do work though. The hg-git plugin will convert
+ # directly from remote repositories, but not via all schemes
+ # (e.g. https is not currently supported). It's probably easier to
+ # use git itself to clone locally and then convert or hg-git from
+ # there.
+ #
+ # We can of course convert directly from remote Subversion repos,
+ # but we need to keep track of that -- you can ask to convert into a
+ # repo that has already been used (for Mercurial) and it'll do so
+ # happily; we don't want that.
+ #
+ # Converting from a remote Hg repo should be fine!
+ #
+ # One other thing -- we can't actually tell the difference between
+ # the various SCM types based on URL alone. We have to try them
+ # (ideally in an order determined by a guess based on the URL) and
+ # see what happens.
+
+project_mirror="$mirrordir/$project"
+mkdir -p "$project_mirror"
+project_repo_mirror="$project_mirror/repo"
+
+ # Some test URLs:
+ #
+ # http://aimc.googlecode.com/svn/trunk/
+ # http://aimc.googlecode.com/svn/
+ # http://vagar.org/git/flam
+ # https://github.com/wslihgt/IMMF0salience.git
+ # http://hg.breakfastquay.com/dssi-vst/
+ # git://github.com/schacon/hg-git.git
+ # http://svn.drobilla.net/lad (externals!)
+
+# If we are importing from another distributed system, then our aim is
+# to create either a Hg repo or a git repo at $project_mirror, which
+# we can then pull from directly to the Hg repo at $local_repo (using
+# hg-git, in the case of a git repo).
+
+# Importing from SVN, we should use hg convert directly to the target
+# hg repo (or should we?) but keep a record of the last changeset ID
+# we brought in, and test each time whether it matches the last
+# changeset ID actually in the repo
+
+success=""
+
+# If we have a record of the last successfully updated remote repo
+# URL, check it against our current remote URL: if it has changed, we
+# will need to start again with a new clone rather than pulling
+# updates into the existing local mirror
+
+successfile="$project_mirror/last_successful_url"
+if [ -f "$successfile" ]; then
+ last=$(cat "$successfile")
+ if [ x"$last" = x"$remote_repo" ]; then
+ echo "$$: Remote URL is unchanged from last successful update"
+ else
+ echo "$$: Remote URL has changed since last successful update:"
+ echo "$$: Last URL was $last, current is $remote_repo"
+ suffix="$$.$(date +%s)"
+ echo "$$: Moving existing repos to $suffix suffix and starting afresh"
+ mv "$project_repo_mirror" "$project_repo_mirror"."$suffix"
+ mv "$local_repo" "$local_repo"."$suffix"
+ mv "$successfile" "$successfile"."$suffix"
+ touch "$project_mirror/url_changed"
+ fi
+fi
+
+if [ -d "$project_repo_mirror" ]; then
+
+ # Repo mirror exists: update it
+ echo "$$: Mirror for project $project exists at $project_repo_mirror, updating" 1>&2
+
+ if [ -d "$project_repo_mirror/.hg" ]; then
+ "$hg" --config extensions.convert= convert --datesort "$remote_repo" "$project_repo_mirror" && success=true
+ if [ -z "$success" ]; then
+ ( cd "$project_repo_mirror" && "$hg" pull "$remote_repo" ) && success=true
+ fi
+ elif [ -d "$project_repo_mirror/.git" ]; then
+ ( cd "$project_repo_mirror" && git pull "$remote_repo" master ) && success=true
+ else
+ echo "$$: ERROR: Repo mirror dir $project_repo_mirror exists but is not an Hg or git repo" 1>&2
+ fi
+
+else
+
+ # Repo mirror does not exist yet
+ echo "$$: Mirror for project $project does not yet exist at $project_repo_mirror, trying to convert or clone" 1>&2
+
+ case "$remote_repo" in
+ *git*)
+ git clone "$remote_repo" "$project_repo_mirror" ||
+ "$hg" --config extensions.convert= convert --datesort "$remote_repo" "$project_repo_mirror"
+ ;;
+ *)
+ "$hg" --config extensions.convert= convert --datesort "$remote_repo" "$project_repo_mirror" ||
+ git clone "$remote_repo" "$project_repo_mirror" ||
+ "$hg" clone "$remote_repo" "$project_repo_mirror"
+ ;;
+ esac && success=true
+
+fi
+
+echo "Success=$success"
+
+if [ -n "$success" ]; then
+ echo "$$: Update successful, pulling into local repo at $local_repo"
+ if [ ! -d "$local_repo" ]; then
+ "$hg" init "$local_repo"
+ fi
+ if [ -d "$project_repo_mirror/.git" ]; then
+ ( cd "$local_repo" && "$hg" --config extensions.hggit= pull "$project_repo_mirror" ) && echo "$remote_repo" > "$successfile"
+ else
+ ( cd "$local_repo" && "$hg" pull "$project_repo_mirror" ) && echo "$remote_repo" > "$successfile"
+ fi
+fi
diff -r 433d4f72a19b -r bb32da3bea34 files/delete.me
--- a/files/delete.me Mon Jan 07 12:01:42 2013 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-default directory for uploaded files
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 lib/redmine.rb
--- a/lib/redmine.rb Mon Jan 07 12:01:42 2013 +0000
+++ b/lib/redmine.rb Mon Jan 07 14:41:20 2013 +0000
@@ -47,10 +47,10 @@
# Permissions
Redmine::AccessControl.map do |map|
- map.permission :view_project, {:projects => [:show], :activities => [:index]}, :public => true, :read => true
+ map.permission :view_project, {:projects => [:show], :activities => [:index], :members => [:index]}, :public => true, :read => true
map.permission :search_project, {:search => :index}, :public => true, :read => true
map.permission :add_project, {:projects => [:new, :create]}, :require => :loggedin
- map.permission :edit_project, {:projects => [:settings, :edit, :update]}, :require => :member
+ map.permission :edit_project, {:projects => [:settings, :edit, :update, :overview]}, :require => :member
map.permission :close_project, {:projects => [:close, :reopen]}, :require => :member, :read => true
map.permission :select_project_modules, {:projects => :modules}, :require => :member
map.permission :manage_members, {:projects => :settings, :members => [:index, :show, :create, :update, :destroy, :autocomplete]}, :require => :member
@@ -194,6 +194,8 @@
Redmine::MenuManager.map :project_menu do |menu|
menu.push :overview, { :controller => 'projects', :action => 'show' }
+ menu.push :members, { :controller => 'members', :action => 'index' }, :param => :project_id
+ menu.push :news, { :controller => 'news', :action => 'index' }, :param => :project_id, :caption => :label_news_plural
menu.push :activity, { :controller => 'activities', :action => 'index' }
menu.push :roadmap, { :controller => 'versions', :action => 'index' }, :param => :project_id,
:if => Proc.new { |p| p.shared_versions.any? }
@@ -202,7 +204,6 @@
:html => { :accesskey => Redmine::AccessKeys.key_for(:new_issue) }
menu.push :gantt, { :controller => 'gantts', :action => 'show' }, :param => :project_id, :caption => :label_gantt
menu.push :calendar, { :controller => 'calendars', :action => 'show' }, :param => :project_id, :caption => :label_calendar
- menu.push :news, { :controller => 'news', :action => 'index' }, :param => :project_id, :caption => :label_news_plural
menu.push :documents, { :controller => 'documents', :action => 'index' }, :param => :project_id, :caption => :label_document_plural
menu.push :wiki, { :controller => 'wiki', :action => 'show', :id => nil }, :param => :project_id,
:if => Proc.new { |p| p.wiki && !p.wiki.new_record? }
diff -r 433d4f72a19b -r bb32da3bea34 lib/redmine/info.rb
--- a/lib/redmine/info.rb Mon Jan 07 12:01:42 2013 +0000
+++ b/lib/redmine/info.rb Mon Jan 07 14:41:20 2013 +0000
@@ -3,7 +3,7 @@
class << self
def app_name; 'Redmine' end
def url; 'http://www.redmine.org/' end
- def help_url; 'http://www.redmine.org/guide' end
+ def help_url; '/projects/soundsoftware-site/wiki/Help' end
def versioned_name; "#{app_name} #{Redmine::VERSION}" end
def environment
diff -r 433d4f72a19b -r bb32da3bea34 lib/redmine/scm/adapters/abstract_adapter.rb
--- a/lib/redmine/scm/adapters/abstract_adapter.rb Mon Jan 07 12:01:42 2013 +0000
+++ b/lib/redmine/scm/adapters/abstract_adapter.rb Mon Jan 07 14:41:20 2013 +0000
@@ -259,7 +259,12 @@
def scm_iconv(to, from, str)
return nil if str.nil?
- return str if to == from
+ # bug 446: non-utf8 paths in repositories blow up repo viewer and reposman
+ # -- Remove this short-circuit: we want the conversion to
+ # happen always, so we can trap the error here if the
+ # source text happens not to be in the advertised
+ # encoding (instead of having the database blow up later)
+# return str if to == from
if str.respond_to?(:force_encoding)
str.force_encoding(from)
begin
diff -r 433d4f72a19b -r bb32da3bea34 lib/redmine/scm/adapters/mercurial/hg-template-0.9.5.tmpl
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/redmine/scm/adapters/mercurial/hg-template-0.9.5.tmpl Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,12 @@
+changeset = 'This template must be used with --debug option\n'
+changeset_quiet = 'This template must be used with --debug option\n'
+changeset_verbose = 'This template must be used with --debug option\n'
+changeset_debug = '\n{author|escape} \n{date|isodate} \n\n{files}{file_adds}{file_dels}{file_copies} \n{desc|escape} \n{tags} \n\n'
+
+file = '{file|urlescape} \n'
+file_add = '{file_add|urlescape} \n'
+file_del = '{file_del|urlescape} \n'
+file_copy = '{name|urlescape} \n'
+tag = '{tag|escape} \n'
+header='\n\n\n'
+footer=' '
diff -r 433d4f72a19b -r bb32da3bea34 lib/redmine/scm/adapters/mercurial/hg-template-1.0.tmpl
--- a/lib/redmine/scm/adapters/mercurial/hg-template-1.0.tmpl Mon Jan 07 12:01:42 2013 +0000
+++ b/lib/redmine/scm/adapters/mercurial/hg-template-1.0.tmpl Mon Jan 07 14:41:20 2013 +0000
@@ -9,4 +9,4 @@
file_copy = '{name|urlescape} \n'
parent = '{node|short} \n'
header='\n\n\n'
-# footer=" "
+footer=''
diff -r 433d4f72a19b -r bb32da3bea34 lib/redmine/scm/adapters/mercurial_adapter.rb
--- a/lib/redmine/scm/adapters/mercurial_adapter.rb Mon Jan 07 12:01:42 2013 +0000
+++ b/lib/redmine/scm/adapters/mercurial_adapter.rb Mon Jan 07 14:41:20 2013 +0000
@@ -198,8 +198,7 @@
output.force_encoding('UTF-8')
end
begin
- # Mercurial < 1.5 does not support footer template for ''
- parse_xml("#{output}")['log']
+ parse_xml("#{output}")['log']
rescue
end
end
diff -r 433d4f72a19b -r bb32da3bea34 log/delete.me
--- a/log/delete.me Mon Jan 07 12:01:42 2013 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-default directory for uploaded files
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 public/favicon.ico
Binary file public/favicon.ico has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/help/wiki_syntax.html
--- a/public/help/wiki_syntax.html Mon Jan 07 12:01:42 2013 +0000
+++ b/public/help/wiki_syntax.html Mon Jan 07 14:41:20 2013 +0000
@@ -44,11 +44,15 @@
h2. Title 2 Title 2
h3. Title 3 Title 3
+Table of contents
+{{toc}} Left-aligned table of contents
+{{>toc}} Right-aligned table of contents
+
Links
http://foo.bar http://foo.bar
"Foo":http://foo.bar Foo
-Redmine links
+Magic links
[[Wiki page]] Wiki page
Issue #12 Issue #12
Revision r43 Revision r43
diff -r 433d4f72a19b -r bb32da3bea34 public/help/wiki_syntax_detailed.html
--- a/public/help/wiki_syntax_detailed.html Mon Jan 07 12:01:42 2013 +0000
+++ b/public/help/wiki_syntax_detailed.html Mon Jan 07 14:41:20 2013 +0000
@@ -210,6 +210,78 @@
Redmine assigns an anchor to each of those headings thus you can link to them with "#Heading", "#Subheading" and so forth.
+
+
+ Bullets and Numbering
+
+
+* First Level Bullet
+** Second Level Bullet
+** Another Second Level Bullet
+*** Third Level Bullet
+** Back to 2nd Level Bullet
+* Back to 1st Level Bullet
+
+
+
+ First Level Bullet
+
+ Second Level Bullet
+ Another Second Level Bullet
+
+ Back to 2nd Level Bullet
+
+
+ Back to 1st Level Bullet
+
+
+
+# First Level Numbering
+## Second Level Numbering
+## Another Second Level Numbering
+### Third Level Numbering
+## Back to 2nd Level Numbering
+# Back to 1st Level Numbering
+
+
+
+ First Level Numbering
+
+ Second Level Numbering
+ Another Second Level Numbering
+
+ Third Level Numbering
+
+ Back to 2nd Level Numbering
+
+ Back to 1st Level Numbering
+
+
+
+# First Level Numbering
+#* Bullet inside numbering environment
+#* Another Bullet inside numbering environment
+# Back to 1st Level Numbering
+
+
+
+ First Level Numbering
+
+ Bullet inside numbering environment
+ Another Bullet inside numbering environment
+
+
+ Back to 1st Level Numbering
+
+
+
+
+
+
+
+
Paragraphs
diff -r 433d4f72a19b -r bb32da3bea34 public/javascripts/application.js
--- a/public/javascripts/application.js Mon Jan 07 12:01:42 2013 +0000
+++ b/public/javascripts/application.js Mon Jan 07 14:41:20 2013 +0000
@@ -603,3 +603,4 @@
$(document).ready(hideOnLoad);
$(document).ready(addFormObserversForDoubleSubmit);
+
diff -r 433d4f72a19b -r bb32da3bea34 public/javascripts/repository.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/repository.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,7 @@
+function toggle_ext_url(){
+ if($('repository_is_external').checked)
+ $('repository_external_url').enable();
+ else
+ $('repository_external_url').disable();
+}
+
diff -r 433d4f72a19b -r bb32da3bea34 public/javascripts/ssamr_institutions.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/ssamr_institutions.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,32 @@
+
+
+/* SSAMR specific functions */
+
+/* institution related functions */
+Event.observe(window, 'load',
+ function() {
+ $('ssamr_user_details_institution_type_true').observe('click', function(e, el) {
+ $('ssamr_user_details_other_institution').disable();
+ $('ssamr_user_details_institution_id').enable();
+ });
+
+ $('ssamr_user_details_institution_type_false').observe('click', function(e, el) {
+ $('ssamr_user_details_other_institution').enable();
+ $('ssamr_user_details_institution_id').disable();
+ });
+
+ if($('ssamr_user_details_institution_type_true').checked)
+ $('ssamr_user_details_other_institution').disable();
+ else if($('ssamr_user_details_institution_type_false').checked)
+ $('ssamr_user_details_institution_id').disable();
+ else {
+ $('ssamr_user_details_other_institution').disable();
+ $('ssamr_user_details_institution_id').enable();
+ $('ssamr_user_details_institution_type_true').checked = true;
+ $('ssamr_user_details_institution_type_false').checked = false;
+ }
+}
+);
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 public/javascripts/ssamr_registration.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/javascripts/ssamr_registration.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,18 @@
+
+
+/* SSAMR specific functions */
+
+/* institution related functions */
+Event.observe(window, 'load',
+ function() {
+ if(!$('ssamr_user_details_institution_type_true').checked && $('ssamr_user_details_institution_type_true').checked){
+ $('ssamr_user_details_other_institution').disable();
+ $('ssamr_user_details_institution_id').enable();
+ $('ssamr_user_details_institution_type_true').checked = true;
+ $('ssamr_user_details_institution_type_false').checked = false;
+ }
+ }
+);
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 public/stylesheets/application.css
--- a/public/stylesheets/application.css Mon Jan 07 12:01:42 2013 +0000
+++ b/public/stylesheets/application.css Mon Jan 07 14:41:20 2013 +0000
@@ -28,9 +28,11 @@
#header {height:5.3em;margin:0;background-color:#628DB6;color:#f8f8f8; padding: 4px 8px 0px 6px; position:relative;}
#header a {color:#f8f8f8;}
#header h1 a.ancestor { font-size: 80%; }
-#quick-search {float:right;}
-#main-menu {position: absolute; bottom: 0px; left:6px; margin-right: -500px;}
+#project-search-jump {float:right; }
+
+
+#main-menu {position: absolute; bottom: 0px; left:8px; margin-right: -500px;}
#main-menu ul {margin: 0; padding: 0;}
#main-menu li {
float:left;
@@ -183,7 +185,7 @@
tr.changeset td.committed_on { text-align: center; width: 15%; white-space:nowrap;}
table.files tr.file td { text-align: center; }
-table.files tr.file td.filename { text-align: left; padding-left: 24px; }
+table.files tr.file td.filename { text-align: left; }
table.files tr.file td.digest { font-size: 80%; }
table.members td.roles, table.memberships td.roles { width: 45%; }
@@ -263,9 +265,12 @@
h3.version { background: url(../images/package.png) no-repeat 0% 50%; padding-left: 20px; }
div.issues h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; }
+div.activity h3 { background: url(../images/ticket.png) no-repeat 0% 50%; padding-left: 20px; }
div.members h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; }
div.news h3 { background: url(../images/news.png) no-repeat 0% 50%; padding-left: 20px; }
div.projects h3 { background: url(../images/projects.png) no-repeat 0% 50%; padding-left: 20px; }
+div.tags h3 { background: url(../images/ticket_note.png) no-repeat 0% 50%; padding-left: 20px; }
+div.institutions h3 { background: url(../images/group.png) no-repeat 0% 50%; padding-left: 20px; }
#watchers ul {margin: 0; padding: 0;}
#watchers li {list-style-type:none;margin: 0px 2px 0px 0px; padding: 0px 0px 0px 0px;}
@@ -364,20 +369,50 @@
div.journal {overflow:auto;}
div.journal.private-notes {border-left:2px solid #d22; padding-left:4px; margin-left:-6px;}
-div#activity dl, #search-results { margin-left: 2em; }
-div#activity dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
-div#activity dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
-div#activity dt.me .time { border-bottom: 1px solid #999; }
-div#activity dt .time { color: #777; font-size: 80%; }
+div#activity dl, div#news dl, #search-results { margin-left: 2em; }
+div#activity .box dl { margin-left: 0; }
+div#activity dd, div#news dd, #search-results dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
+div#activity dt, div#news dt, #search-results dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
+div#activity dt.me .time, div#news dt.me .time { border-bottom: 1px solid #999; }
+div#activity dt .time, div#news dt .time, .projects .latest .time { color: #777; font-size: 80%; }
div#activity dd .description, #search-results dd .description { font-style: italic; }
-div#activity span.project:after, #search-results span.project:after { content: " -"; }
+div#activity span.project:after, div#news span.project:after, #search-results span.project:after { content: " -"; }
div#activity dd span.description, #search-results dd span.description { display:block; color: #808080; }
+div#members dl { margin-left: 2em; }
+div#members dd { margin-bottom: 1em; padding-left: 18px; font-size: 0.9em; }
+div#members dt { margin-bottom: 0px; padding-left: 20px; line-height: 18px; background-position: 0 50%; background-repeat: no-repeat; }
+div#members dt.me .email { border-bottom: 1px solid #999; }
+div#members dt .email { color: #777; font-size: 80%; }
+div#members dd .roles { font-style: italic; }
+
+div#memberbox h3 {
+ background: url(../images/group.png) no-repeat 0% 50%;
+ padding-left: 20px;
+}
+div#memberbox p {
+ padding-left: 20px;
+ margin-left: 0;
+}
+
+div.issues ul {
+ padding-left: 20px;
+ margin-left: 0;
+ list-style-type: none;
+}
+div.issues p {
+ padding-left: 20px;
+ margin-left: 0;
+}
+
+.projects .latest .title { margin-right: 0.5em; }
+.tipoftheday .tip { margin-left: 2em; margin-top: 0.5em; }
+
#search-results dd { margin-bottom: 1em; padding-left: 20px; margin-left:0px; }
-div#search-results-counts {float:right;}
-div#search-results-counts ul { margin-top: 0.5em; }
-div#search-results-counts li { list-style-type:none; float: left; margin-left: 1em; }
+div#search-results-counts { display: block; padding-left: 0; margin-left: 0; }
+div#search-results-counts ul { margin-top: 0.5em; padding-left: 0; margin-left: 0; }
+div#search-results-counts li { display: inline; list-style-type: none; margin-right: 1em; }
dt.issue { background-image: url(../images/ticket.png); }
dt.issue-edit { background-image: url(../images/ticket_edit.png); }
@@ -420,17 +455,21 @@
input#issue_subject { width: 99%; }
select#issue_done_ratio { width: 95px; }
-ul.projects {margin:0; padding-left:1em;}
-ul.projects ul {padding-left:1.6em;}
-ul.projects.root {margin:0; padding:0;}
-ul.projects li {list-style-type:none;}
+ul.projects { margin: 0; padding-left: 1em; }
+ul.projects.root { margin: 0; padding: 0; }
+ul.projects ul.projects { border-left: 3px solid #e0e0e0; }
+ul.projects li.root { list-style-type:none; margin-bottom: 1em; }
+ul.projects li.child { list-style-type:none; margin-top: 1em;}
+ul.projects div.root a.project { font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
#projects-index ul.projects ul.projects { border-left: 3px solid #e0e0e0; padding-left:1em;}
#projects-index ul.projects li.root {margin-bottom: 1em;}
#projects-index ul.projects li.child {margin-top: 1em;}
-#projects-index ul.projects div.root a.project { font-family: "Trebuchet MS", Verdana, sans-serif; font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
+#projects-index ul.projects div.root a.project { font-weight: bold; font-size: 16px; margin: 0 0 10px 0; }
.my-project { padding-left: 18px; background: url(../images/fav.png) no-repeat 0 50%; }
+li.latest { margin-bottom: 0.5em; }
+
#notified-projects ul, #tracker_project_ids ul {max-height:250px; overflow-y:auto;}
#related-issues li img {vertical-align:middle;}
@@ -465,6 +504,9 @@
min-height: 1.8em;
clear:left;
}
+.tabular ul{
+margin-top: -4px;
+}
html>body .tabular p {overflow:hidden;}
@@ -478,6 +520,15 @@
width: 175px;
}
+.tabular .splitcontentleft .box p, .tabular .splitcontentright .box p, .splitcontentleft .tabular p, .splitcontentright .tabular p, .tabular .splitcontentleft .box ul, .tabular .splitcontentright .box ul, .splitcontentleft .tabular ul, .splitcontentright .tabular ul {
+padding-left: 120px;
+}
+
+.tabular .splitcontentleft .box label, .tabular .splitcontentright .box label, .splitcontentleft .tabular label, .splitcontentright .tabular label {
+margin-left: -120px;
+width: 115px;
+}
+
.tabular label.floating{
font-weight: normal;
margin-left: 0px;
@@ -527,12 +578,15 @@
#attachments_fields input.description {margin-left: 8px; width:340px;}
#attachments_fields span {display:block; white-space:nowrap;}
+#attachments_fields input[type=text] {margin-left: 8px; }
+
#attachments_fields img {vertical-align: middle;}
div.attachments { margin-top: 12px; }
div.attachments p { margin:4px 0 2px 0; }
div.attachments img { vertical-align: middle; }
-div.attachments span.author { font-size: 0.9em; color: #888; }
+div.attachments span.author { font-size: 0.9em; color: #888; font-style: italic; padding-left: 4px }
+div.attachments span.size_and_count { font-size: 0.9em; color: #888; padding-left: 4px; }
div.thumbnails {margin-top:0.6em;}
div.thumbnails div {background:#fff;border:2px solid #ddd;display:inline-block;margin-right:2px;}
@@ -1019,7 +1073,30 @@
#activity dt, .journal {clear: left;}
-.journal-link {float: right;}
+td.username img.gravatar {
+ margin: 0 0.5em 0 0;
+ vertical-align: top;
+}
+
+#activity dt img.gravatar, #members dt img.gravatar {
+ float: left;
+ margin: 0 1em 1em 0;
+}
+
+/* Used on 12px Gravatar img tags without the icon background */
+.icon-gravatar {
+ float: left;
+ margin-right: 4px;
+}
+
+#activity dt,
+.journal {
+ clear: left;
+}
+
+.journal-link {
+ float: right;
+}
h2 img { vertical-align:middle; }
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/images/home.png
Binary file public/themes/soundsoftware/images/home.png has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/images/wrench.png
Binary file public/themes/soundsoftware/images/wrench.png has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/application.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/themes/soundsoftware/stylesheets/application.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,254 @@
+@import url(../../../stylesheets/application.css);
+
+/* Colours:
+
+ #be5700 link (orange)
+
+ #3e442c text (dark green)
+ (OK for headings, but small text is easier to read in black)
+
+ #ffa801 logo (yellow)
+
+ #525a38 logotype (olive)
+
+ #fdfaf0 background (cream)
+
+ #fdfbf5 alternate background (lighter cream)
+
+ #ffe69b highlight (light yellow)
+
+ #a9b680 detail (light green)
+*/
+
+body {
+ background: #fdfbf5;
+ color: #000;
+ margin: 0;
+ margin-bottom: 40px;
+ min-width: 620px;
+}
+
+h1 {
+ color: #3e442c;
+}
+
+h2,h3,h4,.wiki h1 {
+ color: #3e442c;
+}
+
+.wiki h2,.wiki h3,.wiki h4 {
+ color: #000;
+}
+
+h2,.wiki h1 {
+ font-size: 1.8em;
+}
+
+.wiki h2 {
+ margin-top: 1em;
+}
+
+h1 { margin:0; padding:0; font-size: 24px; }
+h2, #content h2, .wiki h1 { padding: 2px 10px 1px 0px; margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #3e442c; }
+h3, #content h3, .wiki h2 { font-size: 16px; padding: 2px 10px 1px 0px;margin: 0 0 10px 0; border-bottom: 1px solid #bbbbbb; color: #3e442c; }
+h4, #content h3, .wiki h3 { font-size: 14px; padding: 2px 10px 1px 0px;margin-bottom: 5px; border-bottom: 1px dotted #bbbbbb; color: #3e442c; }
+
+.splitcontentleft p:first-child {
+ margin-top: 0;
+}
+
+div.attachments {
+ margin-top: 2em;
+}
+#wiki_add_attachment {
+ margin-top: 1.5em;
+}
+
+/* Hide these (the paragraph markers that show anchors) -- they confuse more than they help */
+a.wiki-anchor:hover { display: none; }
+h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: none; }
+
+.box {
+ padding: 6px;
+ margin-bottom: 10px;
+ background-color: #fdfaf0;
+ color: #3e442c;
+ line-height: 1.5em;
+ border: 1px solid #a9b680;
+ border-left: 4px solid #a9b680;
+}
+
+.box h4 {
+ margin-top: 0;
+ padding-top: 0;
+}
+
+.odd {background-color:#fdf7e4;}
+.even {background-color: #fdfaf0;}
+
+#content .tabs { margin-bottom: 0; }
+
+table.list th { background-color: #fdfaf0; border-bottom: 1px solid #a9b680; }
+table.list { border: 1px solid #a9b680; /* border-left: 4px solid #a9b680; */ }
+tr.entry { border-left: 1px solid #a9b680; border-right: 1px solid #a9b680; }
+tr.entry:last-child { border-bottom: 1px solid #a9b680; }
+
+table.projects th { text-align: left; }
+table.projects th.managers { color: #3e442c; }
+table.projects .root .name { font-size: 1.2em; padding-top: 0.3em; }
+table.projects .description { padding-bottom: 0.5em; }
+table.projects .no_description { padding-bottom: 0.5em; }
+table.projects .hosted_here { font-weight: bold; }
+table.projects .child .name { font-weight: normal; }
+table.projects .child .description { font-size: 0.95em; }
+table.projects .child .firstcol { padding-left: 1em }
+table.projects .level2 .firstcol { padding-left: 2em; }
+table.projects .level3 .firstcol { padding-left: 3em; }
+
+ul.projects .public, ul.projects .private { padding-left: 0.5em; color: #3e442c; font-size: 0.95em }
+
+table.files tr.active td { padding-top: 0.5em; padding-bottom: 0.5em; }
+table.files .file .active { font-weight: bold; }
+table.files .file .description { font-weight: normal; color: #3e442c; }
+
+#top-menu { position: absolute; top: 0; z-index: 1; left: 0px; width: 100%; font-size: 90%; /* height: 2em; */ margin: 0; padding: 0; padding-top: 0.5em; background-color: #3e442c; }
+#top-menu ul { margin-left: 10px; }
+#top-menu a { font-weight: bold; }
+#header { position: absolute; z-index: 0; top: 0; width: 100%; background: #fdfbf5; border-bottom: 2px solid #a9b680; /* height:80px; */ padding: 20px 0 0.5em 0; margin-bottom: 0; }
+#header a { color: #be5700; }
+#header h1 { color: #525a38; margin-top: 25px; font-size: 3em; font-weight: normal; margin-left: 10px; }
+#header #project-title a, #header #project-title a:hover { color: #525a38; text-decoration: none; }
+.header-general h1 {
+ background: url('soundsoftware-logo-code-title-only-transparent.png') no-repeat 0 0;
+ text-indent: -9999px;
+ width: 537px;
+ height: 34px;
+ }
+
+#quick-search { margin-right: 6px; margin-top: 1em; color: #000; }
+#project-jump-box { float: right; margin-right: 6px; margin-top: 5px; color: #000; }
+#project-ancestors-title {
+ margin-bottom: -6px;
+ margin-left: 12px;
+ margin-top: 6px;
+}
+
+#main-menu { position: absolute; top: 100px; /* background-color: #be5700; */ left: 2px; border-top: 0; width: 100%;/* height: 1.82em; */ padding: 0; margin: 0; border: 0; }
+#main-menu li { margin: 0; padding: 0; }
+#main-menu li a { background-color: #fdfbf5; color: #be5700; border-right: 1px solid #a9b680; font-size: 97%; padding: 0em 8px 0em 10px; font-weight: normal; }
+#main-menu li:last-child a { border-right: 0; }
+#main-menu li a:hover { background-color: #fdfbf5; color: #be5700; text-decoration: underline; }
+#main-menu li a.selected, #main-menu li a.selected:hover { background-color: #fdfbf5; color: #3e442c; }
+
+#footer { background-color: #fdfbf5; border: 0; border-top: 2px solid #a9b680; color: #3e442c; text-align: right; }
+#footer a { color: #be5700; font-weight: bold; }
+
+p.statistics { text-align: right; font-size:0.9em; color: #666; }
+
+#main { margin-top: 135px; font:95%; background: #fdfaf0; }
+#main a { font-weight: medium; color: #be5700;}
+#main a:hover { color: #be5700; text-decoration: underline; }
+#content { background: #fdfbf5; }
+/*#content .tabs ul { bottom:-1px; }
+*/
+h2, h3, h4, .wiki h1, .wiki h2, .wiki h3 { border-bottom: 0px; }
+/*h2, .wiki h1 { letter-spacing:-1px; }
+*/
+/* h4 { border-bottom: dotted 1px #c0c0c0; } */
+
+.wiki p, .wiki li { margin-left: 30px; margin-right: 3em; }
+
+.repository-info .wiki p { margin-left: 0 }
+
+div.issue { background: #fdfaf0; border: 1px solid #a9b680; border-left: 4px solid #a9b680; }
+
+#top-menu a.home, #top-menu a.my-page, #top-menu a.projects, #top-menu a.administration, #top-menu a.help {
+ background-position: 0% 40%;
+ background-repeat: no-repeat;
+ padding-left: 20px;
+ padding-top: 2px;
+ padding-bottom: 3px;
+}
+
+#top-menu a.home { background-image: url(../images/home.png); }
+#top-menu a.my-page { background-image: url(../../../images/user.png); }
+#top-menu a.projects { background-image: url(../../../images/projects.png); }
+#top-menu a.administration { background-image: url(../images/wrench.png); }
+#top-menu a.help { background-image: url(../../../images/help.png); }
+
+/* for Javadoc in Embedded context: */
+
+.TableHeadingColor { background-color: #fdf7e4; color: #3e442c; border: 0px solid #fff; }
+.TableHeadingColor th { background-color: #fdf7e4; color: #3e442c; border: 1px solid #a9b680; }
+.TableHeadingColor th font { font-size: 1.4em; color: #3e442c; }
+.TableSubHeadingColor { background-color: #fdfaf0; color: #3e442c; border: 0px solid #fff; }
+.TableSubHeadingColor th { background-color: #fdfaf0; color: #3e442c; border: 1px solid #a9b680; }
+.TableRowColor { background-color: #fdfbf5; color: #000000; border: 0; }
+.TableRowColor td { background-color: #fdfbf5; color: #000000; border: 0; }
+.NavBarCell1 { background-color: #ffe69b; color:#000000 }
+
+.embedded table { border: 0px solid #fff; }
+.embedded h3 { margin-top: 0.5em; }
+.embedded hr { color: #a9b680; background-color: #a9b680 }
+.embedded center { text-align: left; } /* haha */
+
+/* Special hack to hide the FRAMES | NO FRAMES links -- they don't
+ work in this context -- and right-align the All Classes and Detail links */
+.embedded .NavBarCell2 a[target=_top] { width: 0px; visibility: hidden; }
+.embedded .NavBarCell2 + .NavBarCell2 { text-align: right; }
+.embedded .NavBarCell3 + .NavBarCell3 { text-align: right; }
+
+/* For Doxygen in Embedded context (though note some of the Javadoc
+ rules will also apply to Doxygen): */
+
+.memItemLeft,
+.memItemRight,
+.memTemplParams,
+.memTemplItemLeft,
+.memTemplItemRight,
+.indexkey,
+.indexvalue,
+.memproto,
+.memproto td,
+.memdoc a,
+.embedded li .el,
+.embedded a.el { font-family: monospace; }
+
+.embedded .memTemplParams { font-style: italic; }
+
+.embedded .memItemRight a:first-child,
+.embedded .memTemplItemRight a:first-child,
+.embedded .indexkey a:first-child,
+.embedded a.el,
+.embedded .memdoc a { font-weight: bold; } /* function names, etc */
+
+.embedded .memitem { border-bottom: 1px solid #a9b680; padding-top: 0.5em; }
+.embedded .memitem:last-child { border-bottom: 0px; }
+
+.embedded .contents { margin-top: 0.5em; }
+.embedded .contents td { padding: 0px; }
+
+.embedded .contents h1,
+.embedded .contents h2,
+.embedded .navigation h1,
+.embedded .navigation h2 { padding-top: 0.5em; padding-bottom: 0.25em; }
+
+.embedded .contents .center { text-align: center; } /* undo javadoc hack above */
+
+/* For MATLAB documentation */
+
+.embedded #matlabdoc th { text-align: left; }
+
+/* autocomplete positioning fix */
+div.autocomplete {
+ margin-top:136px;
+}
+
+#my_projects_fieldset.collapsible {
+ font-size: 1.0em;
+ font-color: green;
+}
+
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/fonts-generic.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/themes/soundsoftware/stylesheets/fonts-generic.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,24 @@
+@import url(fonts.css?2);
+
+h1, #project-ancestors-title, #top-menu a {
+ font-family: Insider, 'Gill Sans', Tahoma, sans-serif;
+ font-weight: bold;
+}
+
+#top-menu div, #top-menu li {
+ font-size: 12px;
+}
+
+body,p,li,table {
+ font-family: Insider, DroidSans, 'Liberation Sans', tahoma, verdana, sans-serif;
+ font-size: 14px;
+ line-height: 1.34;
+ font-weight: normal;
+}
+
+h2,h3,h4,.wiki h1,.embedded h1 {
+ font-family: Insider, DroidSans, 'Liberation Sans', tahoma, verdana, sans-serif;
+ font-weight: bold;
+ line-height: 1.34;
+}
+
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/fonts-mac.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/themes/soundsoftware/stylesheets/fonts-mac.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,24 @@
+@import url(fonts.css?2);
+
+h1, #project-ancestors-title, #top-menu a {
+ font-family: Insider, "Lucida Grande", sans-serif;
+ font-weight: bold;
+}
+
+#top-menu div, #top-menu li {
+ font-size: 12px;
+}
+
+body,p,li,table {
+ font-family: Insider, "Lucida Grande", sans-serif;
+ font-size: 14px;
+ line-height: 1.34;
+ font-weight: normal;
+}
+
+h2,h3,h4,.wiki h1,.embedded h1 {
+ font-family: Insider, "Lucida Grande", sans-serif;
+ font-weight: bold;
+ line-height: 1.34;
+}
+
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/fonts-ms.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/themes/soundsoftware/stylesheets/fonts-ms.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,26 @@
+@import url(fonts.css?2);
+
+/* IE likes us to separate out normal & bold into different fonts
+ rather than use the selectors on the same font */
+
+h1, #project-ancestors-title, #top-menu a {
+ font-family: Insider-Medium, Tahoma, sans-serif;
+ font-weight: normal;
+}
+
+#top-menu div, #top-menu li {
+ font-size: 12px;
+}
+
+body,p,li,table {
+ font-family: Insider-Regular, tahoma, verdana, sans-serif;
+ font-size: 14px;
+ line-height: 1.34;
+ font-weight: normal;
+}
+
+h2,h3,h4,.wiki h1,.embedded h1 {
+ font-family: Insider-Medium, tahoma, verdana, sans-serif;
+ font-weight: normal;
+ line-height: 1.34;
+}
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/fonts.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/themes/soundsoftware/stylesheets/fonts.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,32 @@
+
+@font-face {
+ font-family: 'Insider';
+ font-weight: bold;
+ font-style: normal;
+ src: url('fonts/24BC0E_0_0.eot');
+ src: url('fonts/24BC0E_0_0.eot?#iefix') format('embedded-opentype'), url('fonts/24BC0E_0_0.woff') format('woff'), url('fonts/24BC0E_0_0.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Insider';
+ font-weight: normal;
+ font-style: normal;
+ src: url('fonts/24BC35_0_0.eot');
+ src: url('fonts/24BC35_0_0.eot?#iefix') format('embedded-opentype'), url('fonts/24BC35_0_0.woff') format('woff'), url('fonts/24BC35_0_0.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Insider-Medium';
+ font-weight: normal;
+ font-style: normal;
+ src: url('fonts/24BC0E_0_0.eot');
+ src: url('fonts/24BC0E_0_0.eot?#iefix') format('embedded-opentype'), url('fonts/24BC0E_0_0.woff') format('woff'), url('fonts/24BC0E_0_0.ttf') format('truetype');
+}
+
+@font-face {
+ font-family: 'Insider-Regular';
+ font-weight: normal;
+ font-style: normal;
+ src: url('fonts/24BC35_0_0.eot');
+ src: url('fonts/24BC35_0_0.eot?#iefix') format('embedded-opentype'), url('fonts/24BC35_0_0.woff') format('woff'), url('fonts/24BC35_0_0.ttf') format('truetype');
+}
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/soundsoftware-logo-code-title-only-transparent.png
Binary file public/themes/soundsoftware/stylesheets/soundsoftware-logo-code-title-only-transparent.png has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/soundsoftware-logo-code-title-only-transparent.xcf
Binary file public/themes/soundsoftware/stylesheets/soundsoftware-logo-code-title-only-transparent.xcf has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/soundsoftware-logo-title-only-transparent-beta.png
Binary file public/themes/soundsoftware/stylesheets/soundsoftware-logo-title-only-transparent-beta.png has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/soundsoftware-logo-title-only-transparent-beta.xcf
Binary file public/themes/soundsoftware/stylesheets/soundsoftware-logo-title-only-transparent-beta.xcf has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/soundsoftware-logo-title-only-transparent.png
Binary file public/themes/soundsoftware/stylesheets/soundsoftware-logo-title-only-transparent.png has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/soundsoftware/stylesheets/soundsoftware-logo-title-only.png
Binary file public/themes/soundsoftware/stylesheets/soundsoftware-logo-title-only.png has changed
diff -r 433d4f72a19b -r bb32da3bea34 public/themes/ssamr/stylesheets/application.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/public/themes/ssamr/stylesheets/application.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,97 @@
+@import url(../../../stylesheets/application.css);
+
+@font-face
+{
+ /* A font by Jos Buivenga (exljbris) -> www.exljbris.com */
+ font-family: Tallys;
+ src: url('Tallys_15.otf');
+}
+
+@font-face
+{
+ font-family: Droid;
+ src: url('DroidSans.ttf');
+}
+
+@font-face
+{
+ font-family: Droid;
+ font-weight: bold;
+ src: url('DroidSans-Bold.ttf');
+}
+
+@font-face
+{
+ font-family: Gillius;
+ src: url('GilliusADFNo2-Regular.otf');
+}
+
+@font-face
+{
+ font-family: Gillius;
+ font-weight: bold;
+ src: url('GilliusADFNo2-Bold.otf');
+}
+
+body {
+ background: #ffffff;
+ color: #404040;
+ margin: 0;
+ margin-bottom: 40px;
+/* font-size: 95%; */
+}
+
+body,p,h2,h3,h4,li,table {
+ font-family: Droid, tahoma, verdana, sans-serif;
+}
+
+h1 {
+ font-family: Tallys, Cambria, Georgia, "Times New Roman", Times, serif;
+ font-weight: normal;
+}
+
+h2,h3,h4 {
+ color: #000000;
+}
+
+h2 { font-size: 2em; }
+
+#top-menu { position: absolute; top: 0; z-index: 1; left: 0px; width: 100%; font-size: 80%; height: 2em; padding-top: 0.5em; background-color: #000000; }
+#top-menu a { font-weight: bold; }
+#header { position: absolute; z-index: 0; top: 0; width: 100%; background: #ffffff; border-bottom: 2px solid #000; height:80px; padding: 10px 0 0 0; margin-bottom: 0; }
+#header a { color: #000; }
+#header h1 { color: #000; text-shadow: #ccc 1px 1px; margin-top: 30px; font-size: 3em; font-weight: normal; margin-left: 0.3em; }
+#quick-search { margin-right: 6px; margin-top: 2em; color: #000; }
+#main-menu { position: absolute; top: 90px; background-color: #000000; left: 0; border-top: 0; width: 100%; height: 2em; }
+#main-menu li { margin: 0; padding: 0; padding-top: 1px; }
+#main-menu li a { background-color: #000; border-right: 1px solid #fff; font-size: 90%; padding: 4px 8px 4px 8px; font-weight: bold; }
+#main-menu li a:hover { background-color: #80b0da; color: #ffffff; }
+#main-menu li a.selected, #main-menu li a.selected:hover { background-color: #80b0da; color: #ffffff; }
+
+#footer { background-color: #000; border: 0; color: #fff;}
+#footer a { color: #fff; font-weight: bold; }
+
+#main { margin-top: 135px; font:95%; background: #e8eaec; }
+#main a { font-weight: medium; color: #800;}
+#main a:hover { color: #800; text-decoration: underline; }
+#content { background: #fff; }
+/*#content .tabs ul { bottom:-1px; }
+*/
+h2, h3, h4, .wiki h1, .wiki h2, .wiki h3 { border-bottom: 0px; }
+/*h2, .wiki h1 { letter-spacing:-1px; }
+*/
+h4 { border-bottom: dotted 1px #c0c0c0; }
+
+#top-menu a.home, #top-menu a.my-page, #top-menu a.projects, #top-menu a.administration, #top-menu a.help {
+ background-position: 0% 40%;
+ background-repeat: no-repeat;
+ padding-left: 20px;
+ padding-top: 2px;
+ padding-bottom: 3px;
+}
+
+#top-menu a.home { background-image: url(../images/home.png); }
+#top-menu a.my-page { background-image: url(../../../images/user.png); }
+#top-menu a.projects { background-image: url(../../../images/projects.png); }
+#top-menu a.administration { background-image: url(../images/wrench.png); }
+#top-menu a.help { background-image: url(../../../images/help.png); }
diff -r 433d4f72a19b -r bb32da3bea34 test/fixtures/institutions.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/fixtures/institutions.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,7 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+
+one:
+ name: MyString
+
+two:
+ name: MyString
diff -r 433d4f72a19b -r bb32da3bea34 test/fixtures/ssamr_user_details.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/fixtures/ssamr_user_details.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,7 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+
+# one:
+# column: value
+#
+# two:
+# column: value
diff -r 433d4f72a19b -r bb32da3bea34 test/unit/institution_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/institution_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,8 @@
+require 'test_helper'
+
+class InstitutionTest < ActiveSupport::TestCase
+ # Replace this with your real tests.
+ test "the truth" do
+ assert true
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 test/unit/ssamr_user_details_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/unit/ssamr_user_details_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,8 @@
+require 'test_helper'
+
+class SsamrUserDetailsTest < ActiveSupport::TestCase
+ # Replace this with your real tests.
+ test "User Id should be correct" do
+ assert_equal user_id, user.id
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/COPYING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/COPYING Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ 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 2 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, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/README
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/README Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,6 @@
+Embedded plugin for Redmine
+Copyright (C) 2008 Jean-Philippe Lang
+
+The plugin lets you embed html pages (eg. documentation, test reports) in your projects.
+
+See: http://www.redmine.org/wiki/redmine/PluginEmbedded
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/RUNNING_TESTS
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/RUNNING_TESTS Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+rake test:plugins PLUGIN=embedded
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/app/controllers/embedded_controller.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/app/controllers/embedded_controller.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,112 @@
+# Redmine - project management software
+# Copyright (C) 2008 Jean-Philippe Lang
+#
+# 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 2
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require 'iconv'
+
+class EmbeddedController < ApplicationController
+ class EmbeddedControllerError < StandardError; end
+
+ unloadable
+ layout 'base'
+ before_filter :find_project, :authorize
+
+ def index
+ path = get_real_path(params[:path])
+ if File.directory?(path)
+ file = get_index_file(path)
+ target = params[:path] || []
+ target << file
+ # Forces redirect to the index file when the requested path is a directory
+ # so that relative links in embedded html pages work
+ redirect_to :path => target
+ return
+ end
+
+ # Check file extension
+ raise EmbeddedControllerError.new('This file can not be viewed (invalid extension).') unless Redmine::Plugins::Embedded.valid_extension?(path)
+
+ if Redmine::MimeType.is_type?('image', path)
+ send_file path, :disposition => 'inline', :type => Redmine::MimeType.of(path)
+ else
+ embed_file path
+ end
+
+ rescue Errno::ENOENT => e
+ # File was not found
+ render_404
+ rescue Errno::EACCES => e
+ # Can not read the file
+ render_error "Unable to read the file: #{e.message}"
+ rescue EmbeddedControllerError => e
+ render_error e.message
+ end
+
+ private
+
+ def find_project
+ @project = Project.find(params[:id])
+ rescue ActiveRecord::RecordNotFound
+ render_404
+ end
+
+ # Return the path to the html root directory for the current project
+ def get_project_directory
+ @project_directory ||= Setting.plugin_embedded['path'].to_s.gsub('{PROJECT}', @project.identifier)
+ end
+
+ # Returns the absolute path of the requested file
+ # Parameter is an Array
+ def get_real_path(path)
+ real = get_project_directory
+ real = File.join(real, path) unless path.nil? || path.empty?
+ dir = File.expand_path(get_project_directory)
+ real = File.expand_path(real)
+ raise Errno::ENOENT unless real.starts_with?(dir) && File.exist?(real)
+ real
+ end
+
+ # Returns the index file in the given directory
+ # and raises an exception if none is found
+ def get_index_file(dir)
+ indexes = Setting.plugin_embedded['index'].to_s.split
+ file = indexes.find {|f| File.exist?(File.join(dir, f))}
+ raise EmbeddedControllerError.new("No index file found in #{dir} (#{indexes.join(', ')}).") if file.nil?
+ file
+ end
+
+ # Renders a given HTML file
+ def embed_file(path)
+ @content = File.read(path)
+
+ # Extract html title from embedded page
+ if @content =~ %r{([^<]*) }mi
+ @title = $1.strip
+ end
+
+ # Keep html body only
+ @content.gsub!(%r{^.*]*>(.*).*$}mi, '\\1')
+
+ # Re-encode content if needed
+ source_encoding = Setting.plugin_embedded['encoding'].to_s
+ unless source_encoding.blank?
+ begin; @content = Iconv.new('UTF-8', source_encoding).iconv(@content); rescue; end
+ end
+
+ @doc_template = Redmine::Plugins::Embedded.detect_template_from_path(path)
+ render :action => 'index'
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/app/helpers/embedded_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/app/helpers/embedded_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,35 @@
+# Redmine - project management software
+# Copyright (C) 2008 Jean-Philippe Lang
+#
+# 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 2
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module EmbeddedHelper
+
+ # Adds include tags for assets of the given template
+ def asset_include_tags(template)
+
+ Redmine::Plugins::Embedded.assets(template).each { |asset| content_for(:header_tags) { asset_include_tag(asset) } }
+ end
+
+ private
+
+ def asset_include_tag(asset)
+ if asset =~ %r{\.js$}
+ javascript_include_tag(asset, :plugin => 'embedded')
+ else
+ stylesheet_link_tag(asset, :plugin => 'embedded')
+ end
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/app/views/embedded/index.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/app/views/embedded/index.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,9 @@
+
+
+<%= @content %>
+
+
+
+<% html_title(@title) if @title %>
+
+<% asset_include_tags(@doc_template) %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/app/views/settings/_embedded.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/app/views/settings/_embedded.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,22 @@
+HTML directory
+<%= text_field_tag 'settings[path]', @settings['path'], :size => 80 %>
+Use {PROJECT} to include the project identifier in the path
+
+Index files
+<%= text_area_tag 'settings[index]', @settings['index'], :cols => 60, :rows => 3 %>
+Space separated list of index files by priority
+
+Valid extensions
+<%= text_area_tag 'settings[extensions]', @settings['extensions'], :cols => 60, :rows => 3 %>
+Space separated list of file extensions that can be viewed (case insensitive)
+
+Default template
+<%= select_tag 'settings[template]', options_for_select([''] + Redmine::Plugins::Embedded.available_templates, @settings['template']) %>
+
+Files encoding
+<%= text_field_tag 'settings[encoding]', @settings['encoding'] %>
+Eg. ISO-8859-1 Leave this field empty if HTML files are UTF-8 encoded
+
+Menu caption
+<%= text_field_tag 'settings[menu]', @settings['menu'], :size => 30 %>
+Clear this field if you don't want to add a tab to the project menu
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/assets/javascripts/rcov.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/assets/javascripts/rcov.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,18 @@
+function toggleCode( id ) {
+ if ( document.getElementById )
+ elem = document.getElementById( id );
+ else if ( document.all )
+ elem = eval( "document.all." + id );
+ else
+ return false;
+
+ elemStyle = elem.style;
+
+ if ( elemStyle.display != "block" ) {
+ elemStyle.display = "block"
+ } else {
+ elemStyle.display = "none"
+ }
+
+ return true;
+}
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/assets/stylesheets/doxygen.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/assets/stylesheets/doxygen.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,174 @@
+#content {
+ font-family: Geneva, Arial, Helvetica, sans-serif;
+}
+#content h1, h2, h3 {border: 0;}
+#content h1 {margin-bottom: 1em;}
+#content CAPTION { font-weight: bold }
+#content DIV.qindex {
+ line-height: 120%;
+ margin-bottom: 1em;
+}
+#content A.qindex {
+ text-decoration: none;
+ font-weight: bold;
+ padding: 2px;
+}
+#content A.qindexHL {
+ text-decoration: underline;
+ font-weight: bold;
+ padding: 2px;
+}
+#content A.el { text-decoration: none; font-weight: bold }
+#content A.elRef { font-weight: bold }
+#content A.code { text-decoration: none; font-weight: normal; color: #1A419D}
+#content A.codeRef { font-weight: normal; color: #1A419D}
+#content DL.el { margin-left: -1cm }
+#content PRE.fragment {
+ border: 1px solid #CCCCCC;
+ background-color: #f5f5f5;
+ margin-top: 4px;
+ margin-bottom: 4px;
+ margin-left: 2px;
+ margin-right: 8px;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+#content DIV.fragment {
+ border: 1px solid #CCCCCC;
+ background-color: #f5f5f5;
+ padding: 6px;
+}
+#content DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
+#content TD.md { background-color: #F4F4FB; font-weight: bold; }
+#content TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; }
+#content TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; }
+#content DIV.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ margin-bottom: 6px;
+ font-weight: bold;
+ font-family: Geneva, Arial, Helvetica, sans-serif;
+}
+#content DIV.groupText { margin-left: 16px; font-style: italic; font-size: 14px }
+#content TD.indexkey {
+ background-color: #eeeeff;
+ font-weight: bold;
+ padding-right : 10px;
+ padding-top : 2px;
+ padding-left : 10px;
+ padding-bottom : 2px;
+ margin-left : 0px;
+ margin-right : 0px;
+ margin-top : 2px;
+ margin-bottom : 2px;
+ border: 1px solid #CCCCCC;
+}
+#content TD.indexvalue {
+ background-color: #eeeeff;
+ font-style: italic;
+ padding-right : 10px;
+ padding-top : 2px;
+ padding-left : 10px;
+ padding-bottom : 2px;
+ margin-left : 0px;
+ margin-right : 0px;
+ margin-top : 2px;
+ margin-bottom : 2px;
+ border: 1px solid #CCCCCC;
+}
+#content TR.memlist {
+ background-color: #f0f0f0;
+}
+#content P.formulaDsp { text-align: center; }
+#content IMG.formulaDsp { }
+#content IMG.formulaInl { vertical-align: middle; }
+#content SPAN.keyword { color: #008000 }
+#content SPAN.keywordtype { color: #604020 }
+#content SPAN.keywordflow { color: #e08000 }
+#content SPAN.comment { color: #800000 }
+#content SPAN.preprocessor { color: #806020 }
+#content SPAN.stringliteral { color: #002080 }
+#content SPAN.charliteral { color: #008080 }
+#content .mdTable {
+ border: 1px solid #868686;
+ background-color: #F4F4FB;
+}
+#content .mdRow {
+ padding: 8px 10px;
+}
+#content .mdescLeft {
+ padding: 0px 8px 4px 8px;
+ font-size: 14px;
+ font-style: italic;
+ background-color: #FAFAFA;
+ border-top: 1px none #E0E0E0;
+ border-right: 1px none #E0E0E0;
+ border-bottom: 1px none #E0E0E0;
+ border-left: 1px none #E0E0E0;
+ margin: 0px;
+}
+#content .mdescRight {
+ padding: 0px 8px 4px 8px;
+ font-size: 14px;
+ font-style: italic;
+ background-color: #FAFAFA;
+ border-top: 1px none #E0E0E0;
+ border-right: 1px none #E0E0E0;
+ border-bottom: 1px none #E0E0E0;
+ border-left: 1px none #E0E0E0;
+ margin: 0px;
+}
+#content .memItemLeft {
+ padding: 1px 0px 0px 8px;
+ margin: 4px;
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-style: solid;
+ border-top-color: #E0E0E0;
+ border-right-color: #E0E0E0;
+ border-bottom-color: #E0E0E0;
+ border-left-color: #E0E0E0;
+ border-right-style: none;
+ border-bottom-style: none;
+ border-left-style: none;
+ background-color: #FAFAFA;
+ font-family: Geneva, Arial, Helvetica, sans-serif;
+ font-size: 12px;
+}
+#content .memItemRight {
+ padding: 1px 8px 0px 8px;
+ margin: 4px;
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ border-top-style: solid;
+ border-top-color: #E0E0E0;
+ border-right-color: #E0E0E0;
+ border-bottom-color: #E0E0E0;
+ border-left-color: #E0E0E0;
+ border-right-style: none;
+ border-bottom-style: none;
+ border-left-style: none;
+ background-color: #FAFAFA;
+ font-family: Geneva, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+}
+#content .search { color: #003399;
+ font-weight: bold;
+}
+#content FORM.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+#content INPUT.search { font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #eeeeff;
+}
+#content TD.tiny { font-size: 75%;
+}
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/assets/stylesheets/javadoc.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/assets/stylesheets/javadoc.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,23 @@
+/* Javadoc style sheet */
+
+/* Table colors */
+.TableHeadingColor { background: #eef; } /* Dark mauve */
+.TableHeadingColor th b { font-size: 70%; }
+.TableSubHeadingColor { background: #EEEEee; } /* Light mauve */
+.TableRowColor { background: #FFFFFF; } /* White */
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont { font-size: 100%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+.FrameHeadingFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+.FrameItemFont { font-size: 90%; font-family: Helvetica, Arial, sans-serif; color:#000000 }
+
+/* Navigation bar fonts and colors */
+.NavBarCell1 { background-color: inherit; } /* Light mauve */
+.NavBarCell1Rev { background-color: inherit; } /* Dark Blue */
+.NavBarFont1 { font-family: Arial, Helvetica, sans-serif;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; font-style: underline; }
+
+.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000; display: none;}
+.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF; color:#000000}
+
+#content table { border-collapse: collapse; border-color: #ddd; }
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/assets/stylesheets/rcov.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/assets/stylesheets/rcov.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,525 @@
+span.cross-ref-title {
+ font-size: 140%;
+}
+span.cross-ref a {
+ text-decoration: none;
+}
+span.cross-ref {
+ background-color:#f3f7fa;
+ border: 1px dashed #333;
+ margin: 1em;
+ padding: 0.5em;
+ overflow: hidden;
+}
+a.crossref-toggle {
+ text-decoration: none;
+}
+span.marked0 {
+ background-color: rgb(185, 210, 200);
+ display: block;
+}
+span.marked1 {
+ background-color: rgb(190, 215, 205);
+ display: block;
+}
+span.inferred0 {
+ background-color: rgb(175, 200, 200);
+ display: block;
+}
+span.inferred1 {
+ background-color: rgb(180, 205, 205);
+ display: block;
+}
+span.uncovered0 {
+ background-color: rgb(225, 110, 110);
+ display: block;
+}
+span.uncovered1 {
+ background-color: rgb(235, 120, 120);
+ display: block;
+}
+span.overview {
+ border-bottom: 8px solid black;
+}
+div.overview {
+ border-bottom: 8px solid black;
+}
+#content div.footer {
+ font-size: 68%;
+ margin-top: 1.5em;
+}
+#content h1, h2, h3, h4, h5, h6 {
+ margin-bottom: 0.5em;
+}
+h5 {
+ margin-top: 0.5em;
+}
+.hidden {
+ display: none;
+}
+div.separator {
+ height: 10px;
+}
+/* Commented out for better readability, esp. on IE */
+/*
+table tr td, table tr th {
+ font-size: 68%;
+}
+td.value table tr td {
+ font-size: 11px;
+}
+*/
+table.percent_graph {
+ height: 12px;
+ border: #808080 1px solid;
+ empty-cells: show;
+}
+table.percent_graph td.covered {
+ height: 10px;
+ background: #00f000;
+}
+table.percent_graph td.uncovered {
+ height: 10px;
+ background: #e00000;
+}
+table.percent_graph td.NA {
+ height: 10px;
+ background: #eaeaea;
+}
+table.report {
+ border-collapse: collapse;
+ width: 100%;
+}
+table.report td.heading {
+ background: #dcecff;
+ border: #d0d0d0 1px solid;
+ font-weight: bold;
+ text-align: center;
+}
+table.report td.heading:hover {
+ background: #c0ffc0;
+}
+table.report td.text {
+ border: #d0d0d0 1px solid;
+}
+table.report td.value,
+table.report td.lines_total,
+table.report td.lines_code {
+ text-align: right;
+ border: #d0d0d0 1px solid;
+}
+table.report tr.light {
+ background-color: #f6f7f8;
+}
+table.report tr.dark {
+ background-color: #fff;
+}
+span.run0 {
+ background-color: rgb(178, 204, 255);
+ display: block;
+}
+span.run1 {
+ background-color: rgb(178, 206, 255);
+ display: block;
+}
+span.run2 {
+ background-color: rgb(178, 209, 255);
+ display: block;
+}
+span.run3 {
+ background-color: rgb(178, 211, 255);
+ display: block;
+}
+span.run4 {
+ background-color: rgb(178, 214, 255);
+ display: block;
+}
+span.run5 {
+ background-color: rgb(178, 218, 255);
+ display: block;
+}
+span.run6 {
+ background-color: rgb(178, 220, 255);
+ display: block;
+}
+span.run7 {
+ background-color: rgb(178, 223, 255);
+ display: block;
+}
+span.run8 {
+ background-color: rgb(178, 225, 255);
+ display: block;
+}
+span.run9 {
+ background-color: rgb(178, 228, 255);
+ display: block;
+}
+span.run10 {
+ background-color: rgb(178, 232, 255);
+ display: block;
+}
+span.run11 {
+ background-color: rgb(178, 234, 255);
+ display: block;
+}
+span.run12 {
+ background-color: rgb(178, 237, 255);
+ display: block;
+}
+span.run13 {
+ background-color: rgb(178, 239, 255);
+ display: block;
+}
+span.run14 {
+ background-color: rgb(178, 242, 255);
+ display: block;
+}
+span.run15 {
+ background-color: rgb(178, 246, 255);
+ display: block;
+}
+span.run16 {
+ background-color: rgb(178, 248, 255);
+ display: block;
+}
+span.run17 {
+ background-color: rgb(178, 251, 255);
+ display: block;
+}
+span.run18 {
+ background-color: rgb(178, 253, 255);
+ display: block;
+}
+span.run19 {
+ background-color: rgb(178, 255, 253);
+ display: block;
+}
+span.run20 {
+ background-color: rgb(178, 255, 249);
+ display: block;
+}
+span.run21 {
+ background-color: rgb(178, 255, 247);
+ display: block;
+}
+span.run22 {
+ background-color: rgb(178, 255, 244);
+ display: block;
+}
+span.run23 {
+ background-color: rgb(178, 255, 242);
+ display: block;
+}
+span.run24 {
+ background-color: rgb(178, 255, 239);
+ display: block;
+}
+span.run25 {
+ background-color: rgb(178, 255, 235);
+ display: block;
+}
+span.run26 {
+ background-color: rgb(178, 255, 233);
+ display: block;
+}
+span.run27 {
+ background-color: rgb(178, 255, 230);
+ display: block;
+}
+span.run28 {
+ background-color: rgb(178, 255, 228);
+ display: block;
+}
+span.run29 {
+ background-color: rgb(178, 255, 225);
+ display: block;
+}
+span.run30 {
+ background-color: rgb(178, 255, 221);
+ display: block;
+}
+span.run31 {
+ background-color: rgb(178, 255, 219);
+ display: block;
+}
+span.run32 {
+ background-color: rgb(178, 255, 216);
+ display: block;
+}
+span.run33 {
+ background-color: rgb(178, 255, 214);
+ display: block;
+}
+span.run34 {
+ background-color: rgb(178, 255, 211);
+ display: block;
+}
+span.run35 {
+ background-color: rgb(178, 255, 207);
+ display: block;
+}
+span.run36 {
+ background-color: rgb(178, 255, 205);
+ display: block;
+}
+span.run37 {
+ background-color: rgb(178, 255, 202);
+ display: block;
+}
+span.run38 {
+ background-color: rgb(178, 255, 200);
+ display: block;
+}
+span.run39 {
+ background-color: rgb(178, 255, 197);
+ display: block;
+}
+span.run40 {
+ background-color: rgb(178, 255, 193);
+ display: block;
+}
+span.run41 {
+ background-color: rgb(178, 255, 191);
+ display: block;
+}
+span.run42 {
+ background-color: rgb(178, 255, 188);
+ display: block;
+}
+span.run43 {
+ background-color: rgb(178, 255, 186);
+ display: block;
+}
+span.run44 {
+ background-color: rgb(178, 255, 183);
+ display: block;
+}
+span.run45 {
+ background-color: rgb(178, 255, 179);
+ display: block;
+}
+span.run46 {
+ background-color: rgb(179, 255, 178);
+ display: block;
+}
+span.run47 {
+ background-color: rgb(182, 255, 178);
+ display: block;
+}
+span.run48 {
+ background-color: rgb(184, 255, 178);
+ display: block;
+}
+span.run49 {
+ background-color: rgb(187, 255, 178);
+ display: block;
+}
+span.run50 {
+ background-color: rgb(191, 255, 178);
+ display: block;
+}
+span.run51 {
+ background-color: rgb(193, 255, 178);
+ display: block;
+}
+span.run52 {
+ background-color: rgb(196, 255, 178);
+ display: block;
+}
+span.run53 {
+ background-color: rgb(198, 255, 178);
+ display: block;
+}
+span.run54 {
+ background-color: rgb(201, 255, 178);
+ display: block;
+}
+span.run55 {
+ background-color: rgb(205, 255, 178);
+ display: block;
+}
+span.run56 {
+ background-color: rgb(207, 255, 178);
+ display: block;
+}
+span.run57 {
+ background-color: rgb(210, 255, 178);
+ display: block;
+}
+span.run58 {
+ background-color: rgb(212, 255, 178);
+ display: block;
+}
+span.run59 {
+ background-color: rgb(215, 255, 178);
+ display: block;
+}
+span.run60 {
+ background-color: rgb(219, 255, 178);
+ display: block;
+}
+span.run61 {
+ background-color: rgb(221, 255, 178);
+ display: block;
+}
+span.run62 {
+ background-color: rgb(224, 255, 178);
+ display: block;
+}
+span.run63 {
+ background-color: rgb(226, 255, 178);
+ display: block;
+}
+span.run64 {
+ background-color: rgb(229, 255, 178);
+ display: block;
+}
+span.run65 {
+ background-color: rgb(233, 255, 178);
+ display: block;
+}
+span.run66 {
+ background-color: rgb(235, 255, 178);
+ display: block;
+}
+span.run67 {
+ background-color: rgb(238, 255, 178);
+ display: block;
+}
+span.run68 {
+ background-color: rgb(240, 255, 178);
+ display: block;
+}
+span.run69 {
+ background-color: rgb(243, 255, 178);
+ display: block;
+}
+span.run70 {
+ background-color: rgb(247, 255, 178);
+ display: block;
+}
+span.run71 {
+ background-color: rgb(249, 255, 178);
+ display: block;
+}
+span.run72 {
+ background-color: rgb(252, 255, 178);
+ display: block;
+}
+span.run73 {
+ background-color: rgb(255, 255, 178);
+ display: block;
+}
+span.run74 {
+ background-color: rgb(255, 252, 178);
+ display: block;
+}
+span.run75 {
+ background-color: rgb(255, 248, 178);
+ display: block;
+}
+span.run76 {
+ background-color: rgb(255, 246, 178);
+ display: block;
+}
+span.run77 {
+ background-color: rgb(255, 243, 178);
+ display: block;
+}
+span.run78 {
+ background-color: rgb(255, 240, 178);
+ display: block;
+}
+span.run79 {
+ background-color: rgb(255, 238, 178);
+ display: block;
+}
+span.run80 {
+ background-color: rgb(255, 234, 178);
+ display: block;
+}
+span.run81 {
+ background-color: rgb(255, 232, 178);
+ display: block;
+}
+span.run82 {
+ background-color: rgb(255, 229, 178);
+ display: block;
+}
+span.run83 {
+ background-color: rgb(255, 226, 178);
+ display: block;
+}
+span.run84 {
+ background-color: rgb(255, 224, 178);
+ display: block;
+}
+span.run85 {
+ background-color: rgb(255, 220, 178);
+ display: block;
+}
+span.run86 {
+ background-color: rgb(255, 218, 178);
+ display: block;
+}
+span.run87 {
+ background-color: rgb(255, 215, 178);
+ display: block;
+}
+span.run88 {
+ background-color: rgb(255, 212, 178);
+ display: block;
+}
+span.run89 {
+ background-color: rgb(255, 210, 178);
+ display: block;
+}
+span.run90 {
+ background-color: rgb(255, 206, 178);
+ display: block;
+}
+span.run91 {
+ background-color: rgb(255, 204, 178);
+ display: block;
+}
+span.run92 {
+ background-color: rgb(255, 201, 178);
+ display: block;
+}
+span.run93 {
+ background-color: rgb(255, 198, 178);
+ display: block;
+}
+span.run94 {
+ background-color: rgb(255, 196, 178);
+ display: block;
+}
+span.run95 {
+ background-color: rgb(255, 192, 178);
+ display: block;
+}
+span.run96 {
+ background-color: rgb(255, 189, 178);
+ display: block;
+}
+span.run97 {
+ background-color: rgb(255, 187, 178);
+ display: block;
+}
+span.run98 {
+ background-color: rgb(255, 184, 178);
+ display: block;
+}
+span.run99 {
+ background-color: rgb(255, 182, 178);
+ display: block;
+}
+span.run100 {
+ background-color: rgb(255, 178, 178);
+ display: block;
+}
+pre {
+ white-space: pre-wrap; /* CSS2.1 compliant */
+ white-space: -moz-pre-wrap; /* Mozilla-based browsers */
+ white-space: -o-pre-wrap; /* Opera 7+ */
+}
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/init.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/init.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,33 @@
+require 'redmine'
+require 'embedded'
+
+Redmine::Plugin.register :embedded do
+ name 'Embedded'
+ author 'Jean-Philippe Lang'
+ description 'Embed various documentations in your projects'
+ version '0.0.1'
+ settings :default => { 'path' => '/var/doc/{PROJECT}/html',
+ 'index' => 'main.html overview-summary.html index.html',
+ 'extensions' => 'html png gif',
+ 'template' => '',
+ 'encoding' => '',
+ 'menu' => 'Embedded' },
+ :partial => 'settings/embedded'
+
+ project_module :embedded do
+ permission :view_embedded_doc, {:embedded => :index}
+ end
+
+ menu :project_menu, :embedded, { :controller => 'embedded', :action => 'index', :path => nil },
+ :caption => Proc.new { Setting.plugin_embedded['menu'] },
+ :if => Proc.new { !Setting.plugin_embedded['menu'].blank? }
+end
+
+# Routes
+class << ActionController::Routing::Routes;self;end.class_eval do
+ define_method :clear!, lambda {}
+end
+
+ActionController::Routing::Routes.draw do |map|
+ map.connect 'embedded/:id/*path', :controller => 'embedded', :action => 'index'
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/lib/embedded.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/lib/embedded.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,64 @@
+# Redmine - project management software
+# Copyright (C) 2008 Jean-Philippe Lang
+#
+# 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 2
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+module Redmine
+ module Plugins
+ module Embedded
+ class << self
+
+ # Returns an Array of available templates
+ def available_templates
+ assets_by_template.keys.sort
+ end
+
+ # Returns the assets for a given template
+ def assets(template)
+ assets_by_template.has_key?(template) ? assets_by_template[template] : []
+ end
+
+ def detect_template_from_path(path)
+ t = path.to_s.split(%r{[/\\]}) & available_templates
+ t.empty? ? Setting.plugin_embedded['template'].to_s : t.first
+ end
+
+ def valid_extension?(path)
+ extensions = Setting.plugin_embedded['extensions'].to_s.split.each(&:downcase)
+ extensions.include?(File.extname(path).downcase[1..-1])
+ end
+
+ private
+
+ # A Hash of available assets by template
+ def assets_by_template
+ @@assets_by_template ||= scan_assets
+ end
+
+ # Scans assets directory for templates
+ # and returns a Hash of available assets by template
+ def scan_assets
+ a = Hash.new {|h,k| h[k] = [] }
+ Dir.glob(File.join(File.dirname(__FILE__), '../assets/*/*.{css,js}')).each do |asset|
+ asset = File.basename(asset)
+ template = asset.gsub(%r{\.(js|css)$}, '')
+ a[template] << asset
+ end
+ a
+ end
+ end
+ end
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/test/fixtures/html/app-controllers-account_controller_rb.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/test/fixtures/html/app-controllers-account_controller_rb.html Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,783 @@
+
+app/controllers/account_controller.rb - C0 code coverage information
+
+
+
+
+
+ C0 code coverage information
+ Generated on Tue Jun 24 21:43:53 +0200 2008 with rcov 0.8.1.2
+
+
+ Code reported as executed by Ruby looks like this...
+ and this: this line is also marked as covered.
+ Lines considered as run by rcov, but not reported by Ruby, look like this,
+ and this: these lines were inferred by rcov (using simple heuristics).
+ Finally, here's a line marked as not executed.
+
+
+ 1 # redMine - project management software
+ 2 # Copyright (C) 2006-2007 Jean-Philippe Lang
+ 3 #
+ 4 # This program is free software; you can redistribute it and/or
+ 5 # modify it under the terms of the GNU General Public License
+ 6 # as published by the Free Software Foundation; either version 2
+ 7 # of the License, or (at your option) any later version.
+ 8 #
+ 9 # This program is distributed in the hope that it will be useful,
+ 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ 12 # GNU General Public License for more details.
+ 13 #
+ 14 # You should have received a copy of the GNU General Public License
+ 15 # along with this program; if not, write to the Free Software
+ 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ 17
+ 18 class AccountController < ApplicationController
+ 19 layout 'base'
+ 20 helper :custom_fields
+ 21 include CustomFieldsHelper
+ 22
+ 23 # prevents login action to be filtered by check_if_login_required application scope filter
+ 24 skip_before_filter :check_if_login_required, :only => [:login, :lost_password, :register, :activate]
+ 25
+ 26 # Show user's account
+ 27 def show
+ 28 @user = User.find_active(params[:id])
+ 29 @custom_values = @user.custom_values.find(:all, :include => :custom_field)
+ 30
+ 31 # show only public projects and private projects that the logged in user is also a member of
+ 32 @memberships = @user.memberships.select do |membership|
+ 33 membership.project.is_public? || (User.current.member_of?(membership.project))
+ 34 end
+ 35 rescue ActiveRecord::RecordNotFound
+ 36 render_404
+ 37 end
+ 38
+ 39 # Login request and validation
+ 40 def login
+ 41 if request.get?
+ 42 # Logout user
+ 43 self.logged_user = nil
+ 44 else
+ 45 # Authenticate user
+ 46 user = User.try_to_login(params[:username], params[:password])
+ 47 if user
+ 48 self.logged_user = user
+ 49 # generate a key and set cookie if autologin
+ 50 if params[:autologin] && Setting.autologin?
+ 51 token = Token.create(:user => user, :action => 'autologin')
+ 52 cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now }
+ 53 end
+ 54 redirect_back_or_default :controller => 'my', :action => 'page'
+ 55 else
+ 56 flash.now[:error] = l(:notice_account_invalid_creditentials)
+ 57 end
+ 58 end
+ 59 rescue User::OnTheFlyCreationFailure
+ 60 flash.now[:error] = 'Redmine could not retrieve the required information from the LDAP to create your account. Please, contact your Redmine administrator.'
+ 61 end
+ 62
+ 63 # Log out current user and redirect to welcome page
+ 64 def logout
+ 65 cookies.delete :autologin
+ 66 Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin']) if User.current.logged?
+ 67 self.logged_user = nil
+ 68 redirect_to home_url
+ 69 end
+ 70
+ 71 # Enable user to choose a new password
+ 72 def lost_password
+ 73 redirect_to(home_url) && return unless Setting.lost_password?
+ 74 if params[:token]
+ 75 @token = Token.find_by_action_and_value("recovery", params[:token])
+ 76 redirect_to(home_url) && return unless @token and !@token.expired?
+ 77 @user = @token.user
+ 78 if request.post?
+ 79 @user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
+ 80 if @user.save
+ 81 @token.destroy
+ 82 flash[:notice] = l(:notice_account_password_updated)
+ 83 redirect_to :action => 'login'
+ 84 return
+ 85 end
+ 86 end
+ 87 render :template => "account/password_recovery"
+ 88 return
+ 89 else
+ 90 if request.post?
+ 91 user = User.find_by_mail(params[:mail])
+ 92 # user not found in db
+ 93 flash.now[:error] = l(:notice_account_unknown_email) and return unless user
+ 94 # user uses an external authentification
+ 95 flash.now[:error] = l(:notice_can_t_change_password) and return if user.auth_source_id
+ 96 # create a new token for password recovery
+ 97 token = Token.new(:user => user, :action => "recovery")
+ 98 if token.save
+ 99 Mailer.deliver_lost_password(token)
+ 100 flash[:notice] = l(:notice_account_lost_email_sent)
+ 101 redirect_to :action => 'login'
+ 102 return
+ 103 end
+ 104 end
+ 105 end
+ 106 end
+ 107
+ 108 # User self-registration
+ 109 def register
+ 110 redirect_to(home_url) && return unless Setting.self_registration?
+ 111 if request.get?
+ 112 @user = User.new(:language => Setting.default_language)
+ 113 else
+ 114 @user = User.new(params[:user])
+ 115 @user.admin = false
+ 116 @user.login = params[:user][:login]
+ 117 @user.status = User::STATUS_REGISTERED
+ 118 @user.password, @user.password_confirmation = params[:password], params[:password_confirmation]
+ 119 case Setting.self_registration
+ 120 when '1'
+ 121 # Email activation
+ 122 token = Token.new(:user => @user, :action => "register")
+ 123 if @user.save and token.save
+ 124 Mailer.deliver_register(token)
+ 125 flash[:notice] = l(:notice_account_register_done)
+ 126 redirect_to :action => 'login'
+ 127 end
+ 128 when '3'
+ 129 # Automatic activation
+ 130 @user.status = User::STATUS_ACTIVE
+ 131 if @user.save
+ 132 self.logged_user = @user
+ 133 flash[:notice] = l(:notice_account_activated)
+ 134 redirect_to :controller => 'my', :action => 'account'
+ 135 end
+ 136 else
+ 137 # Manual activation by the administrator
+ 138 if @user.save
+ 139 # Sends an email to the administrators
+ 140 Mailer.deliver_account_activation_request(@user)
+ 141 flash[:notice] = l(:notice_account_pending)
+ 142 redirect_to :action => 'login'
+ 143 end
+ 144 end
+ 145 end
+ 146 end
+ 147
+ 148 # Token based account activation
+ 149 def activate
+ 150 redirect_to(home_url) && return unless Setting.self_registration? && params[:token]
+ 151 token = Token.find_by_action_and_value('register', params[:token])
+ 152 redirect_to(home_url) && return unless token and !token.expired?
+ 153 user = token.user
+ 154 redirect_to(home_url) && return unless user.status == User::STATUS_REGISTERED
+ 155 user.status = User::STATUS_ACTIVE
+ 156 if user.save
+ 157 token.destroy
+ 158 flash[:notice] = l(:notice_account_activated)
+ 159 end
+ 160 redirect_to :action => 'login'
+ 161 end
+ 162
+ 163 private
+ 164 def logged_user=(user)
+ 165 if user && user.is_a?(User)
+ 166 User.current = user
+ 167 session[:user_id] = user.id
+ 168 else
+ 169 User.current = User.anonymous
+ 170 session[:user_id] = nil
+ 171 end
+ 172 end
+ 173 end
+
+ Generated using the rcov code coverage analysis tool for Ruby
+ version 0.8.1.2.
+
+
+
+
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/test/fixtures/html/index.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/test/fixtures/html/index.html Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,306 @@
+
+C0 code coverage information
+
+
+
+
+ C0 code coverage information
+ Generated on Tue Jun 24 21:43:50 +0200 2008 with rcov 0.8.1.2
+
+
+
+
+ Generated using the rcov code coverage analysis tool for Ruby
+ version 0.8.1.2.
+
+
+
+
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/test/fixtures/html/misc/misc.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/test/fixtures/html/misc/misc.html Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+Misc file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/test/fixtures/html/misc/misc.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/test/fixtures/html/misc/misc.txt Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+Misc file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/test/functional/embedded_controller_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/test/functional/embedded_controller_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,63 @@
+# Redmine - project management software
+# Copyright (C) 2008 Jean-Philippe Lang
+#
+# 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 2
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class EmbeddedControllerTest < ActionController::TestCase
+ fixtures :projects, :enabled_modules, :users, :roles, :members
+
+ def setup
+ fixtures_path = File.dirname(__FILE__) + '/../fixtures/html'
+
+ Setting.plugin_embedded = { 'path' => fixtures_path,
+ 'index' => 'main.html overview-summary.html index.html',
+ 'extensions' => 'html png gif',
+ 'template' => '',
+ 'encoding' => '',
+ 'menu' => 'Embedded' }
+
+ Project.find(1).enabled_modules << EnabledModule.new(:name => 'embedded')
+
+ anonymous = Role.anonymous
+ anonymous.permissions += [:view_embedded_doc]
+ assert anonymous.save
+ end
+
+ def test_get_root_should_redirect_to_index_file
+ get :index, :id => 'ecookbook'
+ assert_redirected_to :path => ['index.html']
+ end
+
+ def test_get_index_file
+ get :index, :id => 'ecookbook', :path => ['index.html']
+ assert_response :success
+ assert_template 'index'
+ assert_tag :h3, :content => 'C0 code coverage information'
+ end
+
+ def test_get_subdirectory_file
+ get :index, :id => 'ecookbook', :path => ['misc', 'misc.html']
+ assert_response :success
+ assert_template 'index'
+ assert_tag :b, :content => 'Misc file'
+ end
+
+ def test_get_invalid_extension_should_be_denied
+ get :index, :id => 'ecookbook', :path => ['misc', 'misc.txt']
+ assert_response 500
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/test/test_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/test/test_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,38 @@
+ENV["RAILS_ENV"] ||= "test"
+require File.expand_path(File.dirname(__FILE__) + "/../../../../config/environment")
+require 'test_help'
+
+class Test::Unit::TestCase
+ # Transactional fixtures accelerate your tests by wrapping each test method
+ # in a transaction that's rolled back on completion. This ensures that the
+ # test database remains unchanged so your fixtures don't have to be reloaded
+ # between every test method. Fewer database queries means faster tests.
+ #
+ # Read Mike Clark's excellent walkthrough at
+ # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
+ #
+ # Every Active Record database supports transactions except MyISAM tables
+ # in MySQL. Turn off transactional fixtures in this case; however, if you
+ # don't care one way or the other, switching from MyISAM to InnoDB tables
+ # is recommended.
+ #
+ # The only drawback to using transactional fixtures is when you actually
+ # need to test transactions. Since your test is bracketed by a transaction,
+ # any transactions started in your code will be automatically rolled back.
+ self.use_transactional_fixtures = true
+
+ # Instantiated fixtures are slow, but give you @david where otherwise you
+ # would need people(:david). If you don't want to migrate your existing
+ # test cases which use the @david style and don't mind the speed hit (each
+ # instantiated fixtures translates to a database query per test method),
+ # then set this back to true.
+ self.use_instantiated_fixtures = false
+
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
+ #
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
+ # -- they do not yet inherit this setting
+ fixtures :all
+
+ # Add more helper methods to be used by all tests here...
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/embedded/test/unit/embedded_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/embedded/test/unit/embedded_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,54 @@
+# Redmine - project management software
+# Copyright (C) 2008 Jean-Philippe Lang
+#
+# 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 2
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class EmbeddedTest < ActiveSupport::TestCase
+
+ def setup
+ Setting.plugin_embedded = { 'path' => '/path/to',
+ 'index' => 'main.html overview-summary.html index.html',
+ 'extensions' => 'html png gif',
+ 'template' => 'doxygen',
+ 'encoding' => '',
+ 'menu' => 'Embedded' }
+ end
+
+ def test_available_templates
+ assert_equal ['doxygen', 'javadoc', 'rcov'], Redmine::Plugins::Embedded.available_templates
+ end
+
+ def test_assets
+ assert_equal ['rcov.css', 'rcov.js'], Redmine::Plugins::Embedded.assets('rcov')
+ end
+
+ def test_detect_template_from_path
+ to_test = { '/path/to/doc' => 'doxygen',
+ '/path/to/javadoc/html' => 'javadoc' }
+
+ to_test.each { |path, template| assert_equal template, Redmine::Plugins::Embedded.detect_template_from_path(path) }
+ end
+
+ def test_valid_extension
+ to_test = {'index.html' => true,
+ 'path/to/index.html' => true,
+ 'path/to/image.png' => true,
+ 'path/to/something.else' => false}
+
+ to_test.each { |path, expected| assert_equal expected, Redmine::Plugins::Embedded.valid_extension?(path) }
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/engines/generators/plugin_migration/templates/plugin_migration.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/engines/generators/plugin_migration/templates/plugin_migration.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,13 @@
+class <%= class_name %> < ActiveRecord::Migration
+ def self.up
+ <%- plugins.each do |plugin| -%>
+ Engines.plugins["<%= plugin.name %>"].migrate(<%= new_versions[plugin.name] %>)
+ <%- end -%>
+ end
+
+ def self.down
+ <%- plugins.each do |plugin| -%>
+ Engines.plugins["<%= plugin.name %>"].migrate(<%= current_versions[plugin.name] %>)
+ <%- end -%>
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/README.rdoc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/README.rdoc Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,3 @@
+= bibliography
+
+Description goes here
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/controllers/authors_controller.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/controllers/authors_controller.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,13 @@
+class AuthorsController < ApplicationController
+ helper :publications
+ include PublicationsHelper
+
+ def index
+ @authors = Author.find(:all)
+ end
+
+ def show
+ @author = Author.find(params[:id])
+ end
+
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/controllers/authorships_controller.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/controllers/authorships_controller.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,10 @@
+class AuthorshipsController < ApplicationController
+
+ def index
+
+ end
+
+
+ def update
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/controllers/bibtex_entries_controller.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/controllers/bibtex_entries_controller.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,3 @@
+class BibtexEntriesController < ApplicationController
+
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,343 @@
+# -*- coding: utf-8 -*-
+# vendor/plugins/redmine_bibliography/app/controllers/publications_controller.rb
+
+class PublicationsController < ApplicationController
+ unloadable
+
+ model_object Publication
+ before_filter :find_model_object, :except => [:new, :create, :index, :get_bibtex_required_fields, :autocomplete_for_project, :add_author, :sort_author_order, :autocomplete_for_author, :get_user_info ]
+ before_filter :find_project_by_project_id, :authorize, :only => [ :edit, :new, :update, :create ]
+
+ def new
+ find_project_by_project_id
+ @publication = Publication.new
+
+ # we'll always want a new publication to have its bibtex entry
+ @publication.build_bibtex_entry
+
+ # and at least one author
+ # @publication.authorships.build.build_author
+ @author_options = [["#{User.current.name} (@#{User.current.mail.partition('@')[2]})", "#{User.current.class.to_s}_#{User.current.id.to_s}"]]
+ end
+
+ def create
+ @project = Project.find(params[:project_id])
+
+ @author_options = []
+
+ @publication = Publication.new(params[:publication])
+ @publication.projects << @project unless @project.nil?
+
+ if @publication.save
+ @publication.notify_authors_publication_added(@project)
+
+ flash[:notice] = "Successfully created publication."
+ redirect_to :action => :show, :id => @publication, :project_id => @project
+ else
+ render :action => 'new', :project_id => @project
+ end
+ end
+
+ def index
+ if !params[:project_id].nil?
+ find_project_by_project_id
+ @project = Project.find(params[:project_id])
+ @publications = Publication.find :all, :joins => :projects, :conditions => ["project_id = ?", @project.id]
+ else
+ @publications = Publication.find :all
+ end
+ end
+
+ def new_from_bibfile
+ @publication.current_step = session[:publication_step]
+
+ # contents of the paste text area
+ bibtex_entry = params[:bibtex_entry]
+
+ # method for creating "pasted" bibtex entries
+ if bibtex_entry
+ parse_bibtex_list bibtex_entry
+ end
+ end
+
+ def get_bibtex_required_fields
+
+ unless params[:value].empty?
+ fields = BibtexEntryType.fields(params[:value])
+ end
+
+ respond_to do |format|
+ format.js {
+ render(:update) {|page|
+ if params[:value].empty?
+ page << "hideOnLoad();"
+ else
+ page << "show_required_bibtex_fields(#{fields.to_json()});"
+ end
+ }
+ }
+
+ end
+ end
+
+ def add_author
+ if (request.xhr?)
+ render :text => User.find(params[:user_id]).name
+ else
+ # No? Then render an action.
+ #render :action => 'view_attribute', :attr => @name
+ logger.error { "Error while adding Author to publication." }
+ end
+ end
+
+ def edit
+ find_project_by_project_id unless params[:project_id].nil?
+
+ @edit_view = true;
+ @publication = Publication.find(params[:id])
+ @selected_bibtex_entry_type_id = @publication.bibtex_entry.entry_type
+
+ @author_options = []
+
+ @bibtype_fields = BibtexEntryType.fields(@selected_bibtex_entry_type_id)
+ end
+
+ def update
+ @publication = Publication.find(params[:id])
+ @author_options = []
+
+ if @publication.update_attributes(params[:publication])
+ flash[:notice] = "Successfully updated Publication."
+
+ # expires the previosly cached entries
+ Rails.cache.delete "publication-#{@publication.id}-ieee"
+ Rails.cache.delete "publication-#{@publication.id}-bibtex"
+
+ if !params[:project_id].nil?
+ redirect_to :action => :show, :id => @publication, :project_id => params[:project_id]
+ else
+ redirect_to :action => :show, :id => @publication
+ end
+ else
+ render :action => 'edit'
+ end
+ end
+
+
+ def show
+ find_project_by_project_id unless params[:project_id].nil?
+
+ if @publication.nil?
+ @publications = Publication.all
+ render "index", :alert => 'The publication was not found!'
+ else
+ @authors = @publication.authors
+ @bibtext_entry = @publication.bibtex_entry
+ end
+ end
+
+ # parse string with bibtex authors
+ def parse_authors(authors_entry)
+ # in bibtex the authors are always seperated by "and"
+ return authors_entry.split(" and ")
+ end
+
+ # parses a list of bibtex
+ def parse_bibtex_list(bibtex_list)
+ bibliography = BibTeX.parse bibtex_list
+
+ no_entries = bibliography.data.length
+
+ # parses the bibtex entries
+ bibliography.data.map do |d|
+
+ if d.class == BibTeX::Entry
+ create_bibtex_entry d
+ end
+ end
+ end
+
+ def create_bibtex_entry(d)
+ @publication = Publication.new
+ @bentry = BibtexEntry.new
+ authors = []
+ institution = ""
+ email = ""
+
+ d.fields.keys.map do |field|
+ case field.to_s
+ when "author"
+ authors = parse_authors d[field]
+ when "title"
+ @publication.title = d[field]
+ when "institution"
+ institution = d[field]
+ when "email"
+ email = d[field]
+ else
+ @bentry[field] = d[field]
+ end
+ end
+
+ @publication.bibtex_entry = @bentry
+ @publication.save
+
+ # what is this for???
+ # @created_publications << @publication.id
+
+ # need to save all authors
+ # and establish the author-publication association
+ # via the authorships table
+ authors.each_with_index.map do |authorname, idx|
+ author = Author.new(:name => authorname)
+ if author.save!
+ # todo: catch the errors...
+ puts "SAVED"
+ else
+ puts "NOT SAVED"
+ end
+
+ author.authorships.create!(
+ :publication => @publication,
+ :institution => institution,
+ :email => email,
+ :order => idx)
+ end
+ end
+
+ # parses the bibtex file
+ def parse_bibtex_file
+
+ end
+
+ def import
+ @publication = Publication.new
+
+
+ end
+
+ def autocomplete_for_project
+ @publication = Publication.find(params[:id])
+
+ @projects = Project.active.like(params[:q]).find(:all, :limit => 100) - @publication.projects
+ logger.debug "Query for \"#{params[:q]}\" returned \"#{@projects.size}\" results"
+ render :layout => false
+ end
+
+ def autocomplete_for_author
+ @results = []
+
+ object_id = params[:object_id]
+ @object_name = "publications[authorships_attributes][#{object_id}][search_results]"
+
+ # cc 20110909 -- revert to like instead of like_unique -- see #289
+ authorships_list = Authorship.like(params[:q]).find(:all, :limit => 100)
+ users_list = User.active.like(params[:q]).find(:all, :limit => 100)
+
+ logger.debug "Query for \"#{params[:q]}\" returned \"#{authorships_list.size}\" authorships and \"#{users_list.size}\" users"
+
+ @results = users_list
+
+ # TODO: can be optimized…
+ authorships_list.each do |authorship|
+ flag = true
+
+ users_list.each do |user|
+ if authorship.name == user.name && authorship.email == user.mail && authorship.institution == user.institution
+ Rails.logger.debug { "Rejecting Authorship #{authorship.id}" }
+ flag = false
+ break
+ end
+ end
+
+ @results << authorship if flag
+ end
+
+ render :layout => false
+ end
+
+ def get_user_info
+ object_id = params[:object_id]
+ value = params[:value]
+ classname = Kernel.const_get(value.split('_')[0])
+
+ item = classname.find(value.split('_')[1])
+
+ name_field = "publication_authorships_attributes_#{object_id}_name_on_paper".to_sym
+ email_field = "publication_authorships_attributes_#{object_id}_email".to_sym
+ institution_field = "publication_authorships_attributes_#{object_id}_institution".to_sym
+
+ yes_radio = "publication_authorships_attributes_#{object_id}_identify_author_yes".to_sym
+
+ respond_to do |format|
+ format.js {
+ render(:update) {|page|
+ page[name_field].value = item.name
+ page[email_field].value = item.mail
+ page[institution_field].value = item.institution
+
+ page[yes_radio].checked = true
+ page[name_field].readOnly = true
+ page[email_field].readOnly = true
+ page[institution_field].readOnly = true
+ }
+ }
+ end
+ end
+
+ def sort_author_order
+ params[:authorships].each_with_index do |id, index|
+ Authorship.update_all(['auth_order=?', index+1], ['id=?', id])
+ end
+ render :nothing => true
+ end
+
+ def add_project
+ @projects = Project.find(params[:publication][:project_ids])
+ @publication.projects << @projects
+ @project = Project.find(params[:project_id])
+
+ # TODO luisf should also respond to HTML???
+ respond_to do |format|
+ format.html { redirect_to :back }
+ format.js {
+ render(:update) {|page|
+ page[:add_project_form].reset
+ page.replace_html :list_projects, :partial => 'list_projects'
+ }
+ }
+ end
+ end
+
+
+ def remove_project
+ @project = Project.find(params[:project_id])
+ proj = Project.find(params[:remove_project_id])
+
+ if @publication.projects.length > 1
+ if @publication.projects.exists? proj
+ @publication.projects.delete proj if request.post?
+ end
+ else
+ logger.error { "Cannot remove project from publication list" }
+ end
+
+ logger.error { "CURRENT project name#{proj.name} and wanna delete #{@project.name}" }
+
+ render(:update) {|page|
+ page.replace_html "list_projects", :partial => 'list_projects', :id => @publication
+ }
+ end
+
+ def destroy
+ find_project_by_project_id
+
+ @publication.destroy
+
+ flash[:notice] = "Successfully deleted Publication."
+ redirect_to :controller => :publications, :action => 'index', :project_id => @project
+ end
+
+ private
+
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/helpers/authors_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/helpers/authors_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,28 @@
+module AuthorsHelper
+ unloadable
+
+ def render_author_publications(author)
+ s = ""
+ pubs = []
+
+ author.publications.each do |pub|
+ pubs << link_to(pub.title, pub)
+ end
+
+ if pubs.size < 3
+ s << '' << pubs.join(', ') << ' '
+ else
+ s << pubs.join(', ')
+ end
+ s
+ end
+
+
+ # Generates a link to an author
+ # todo: test options
+ def link_to_author(author, options={}, html_options = nil)
+ url = {:controller => 'authors', :action => 'show', :id => author}.merge(options)
+ link_to(h(author.name), url, html_options)
+ end
+
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/helpers/authorships_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/helpers/authorships_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,21 @@
+# -*- coding: undecided -*-
+module AuthorshipsHelper
+
+ # Generates a link to either author or user, depending on which is
+ # available
+ def link_to_authorship(authorship)
+ s = ''
+ if authorship.author.nil?
+ # legacy reasons…
+ s << h(authorship.name_on_paper)
+ else
+ if authorship.author.user.nil?
+ s << link_to(authorship.name_on_paper, :controller => 'authors', :action => 'show', :id => authorship.author)
+ else
+ s << link_to(authorship.name_on_paper, :controller => 'users', :action => 'show', :id => authorship.author.user)
+ end
+ end
+ s
+ end
+
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/helpers/bibtex_entries_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/helpers/bibtex_entries_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,3 @@
+module BibtexEntriesHelper
+
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/helpers/my_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/helpers/my_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,38 @@
+module MyHelper
+
+ def get_my_publications()
+ if not User.current.author.nil?
+ @my_publications = Publication.all(:include => :authors, :conditions => "authors.id = #{User.current.author.id}")
+ else
+ @my_publications = []
+ end
+ end
+
+ def render_publications_projects(publication)
+ s = ""
+ projs = []
+
+ publication.projects.each do |proj|
+ projs << link_to(proj.name, proj)
+ end
+
+ s << projs.join(', ')
+
+ s
+ end
+
+ def render_publications_authors(publication)
+ s = ""
+ auths = []
+
+ publication.authorships.each do |auth|
+ auths << h(auth.name_on_paper)
+ end
+
+ s << auths.join(', ')
+
+ s
+ end
+
+
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/helpers/publications_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/helpers/publications_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,147 @@
+# -*- coding: utf-8 -*-
+require 'bibtex'
+
+module PublicationsHelper
+ include AuthorshipsHelper
+
+ def link_to_publication(publication, options={}, html_options = nil)
+ url = {:controller => 'publications', :action => 'show', :id => publication}.merge(options)
+ link_to(h(publication.title), url, html_options)
+ end
+
+ def projects_check_box_tags(name, projects)
+ s = ''
+ projects.sort.each do |project|
+ if User.current.allowed_to?(:edit_publication, project)
+ s << "#{ check_box_tag name, project.id, false } #{link_to_project project} \n"
+ s << ' '
+ end
+ end
+
+ s
+ end
+
+ def choose_author_link(object_name, items)
+ # called by autocomplete_for_author (publications' action/view)
+ # creates the select list based on the results array
+ # results is an array with both Users and Authorships objects
+
+ @author_options = []
+ @results.each do |result|
+ email_bit = result.mail.partition('@')[2]
+ if email_bit != "":
+ email_bit = "(@#{email_bit})"
+ end
+ @author_options << ["#{result.name} #{email_bit}", "#{result.class.to_s}_#{result.id.to_s}"]
+ end
+
+ if @results.size > 0
+ s = select_tag( form_tag_name(object_name, :author_search_results), options_for_select(@author_options), { :id => form_tag_id(object_name, :author_search_results), :size => 3} )
+ s << observe_field( form_tag_id(object_name, :author_search_results), :on => 'click', :function => "alert('Element changed')", :with => 'q')
+ else
+ s = "No Authors found that match your search… sorry! "
+ end
+ end
+
+ def link_to_remove_fields(name, f)
+ f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)", :class => 'icon icon-del')
+ end
+
+ def link_to_add_author_fields(name, f, association, action)
+ new_object = f.object.class.reflect_on_association(association).klass.new
+ fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
+ render(association.to_s.singularize + "_fields", :f => builder)
+ end
+ link_to_function(name, h("add_author_fields(this, '#{association}', '#{escape_javascript(fields)}', '#{action}')"), { :class => 'icon icon-add', :id => "add_another_author" })
+ end
+
+ def sanitized_object_name(object_name)
+ object_name.gsub(/\]\[|[^-a-zA-Z0-9:.]/,"_").sub(/_$/,"")
+ end
+
+ def sanitized_method_name(method_name)
+ method_name.sub(/\?$/, "")
+ end
+
+ def form_tag_name(object_name, method_name)
+ str = "#{object_name.to_s}[#{sanitized_method_name(method_name.to_s)}]"
+ str.to_sym
+ end
+
+ def form_tag_id(object_name, method_name)
+ str = "#{sanitized_object_name(object_name.to_s)}_#{sanitized_method_name(method_name.to_s)}"
+ str.to_sym
+ end
+
+ def form_object_id(object_name)
+ str = object_name.split("\[").last().gsub("\]","")
+ str.to_sym
+ end
+
+ def render_authorships_list(publication)
+ s = ''
+
+ publication.authorships.each do |authorship|
+ s << link_to_authorship(authorship)
+ s << "#{authorship.institution}
"
+ end
+
+ s
+ end
+
+ def render_projects_list(publication, show_delete_icon)
+ s= ""
+
+ publication.projects.visible.each do |proj|
+ s << link_to_project(proj, {}, :class => 'publication_project')
+
+ if show_delete_icon
+ if User.current.allowed_to?(:edit_publication, @project)
+ if @project == proj
+ # todo: move this message to yml file
+ confirm_msg = 'Are you sure you want to remove the current project from this publication\'s projects list?'
+ else
+ confirm_msg = false
+ end
+
+ s << link_to_remote(l(:button_delete), { :url => { :controller => 'publications', :action => 'remove_project', :id => publication, :remove_project_id => proj, :project_id => @project }, :method => :post, :confirm => confirm_msg }, :class => 'icon icon-del')
+ end
+ end
+
+ s << " "
+ end
+
+ s
+ end
+
+ def print_ieee_format(publication)
+ Rails.cache.fetch("publication-#{publication.id}-ieee") do
+ publication.print_entry(:ieee)
+ end
+ end
+
+ def print_bibtex_format(publication)
+ Rails.cache.fetch("publication-#{publication.id}-bibtex") do
+ publication.print_entry(:bibtex)
+ end
+ end
+
+
+ def show_bibtex_fields(bibtex_entry)
+ s = ""
+ bibtex_entry.attributes.keys.sort.each do |key|
+ value = bibtex_entry.attributes[key].to_s
+ next if key == 'id' or key == 'publication_id' or value == ""
+ s << "" + l("field_#{key}") + " "
+ s << ""
+ if key == "entry_type"
+ s << bibtex_entry.entry_type_label
+ else
+ s << value
+ end
+ s << "
"
+ end
+ s
+ end
+end
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/models/author.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/models/author.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,20 @@
+class Author < ActiveRecord::Base
+ unloadable
+
+ has_many :authorships, :dependent => :destroy
+ has_many :publications, :through => :authorships
+
+ belongs_to :user
+
+ def <=>(author)
+ name.downcase <=> author.name.downcase
+ end
+
+ named_scope :like, lambda {|q|
+ s = "%#{q.to_s.strip.downcase}%"
+ {:conditions => ["LOWER(name) LIKE :s", {:s => s}],
+ :order => 'name'
+ }
+ }
+
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/models/authorship.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/models/authorship.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,71 @@
+class Authorship < ActiveRecord::Base
+ unloadable
+
+ belongs_to :author
+ belongs_to :publication
+
+ accepts_nested_attributes_for :author
+ accepts_nested_attributes_for :publication
+
+ validates_presence_of :name_on_paper
+
+ attr_accessor :is_user, :author_user_id, :search_name, :identify_author, :search_results
+ before_save :associate_author_user
+
+ named_scope :like_unique, lambda {|q|
+ s = "%#{q.to_s.strip.downcase}%"
+ {:conditions => ["LOWER(name_on_paper) LIKE :s OR LOWER(email) LIKE :s", {:s => s}],
+ :order => 'name_on_paper',
+ :group => "name_on_paper, institution, email"
+ }
+ }
+
+ named_scope :like, lambda {|q|
+ s = "%#{q.to_s.strip.downcase}%"
+ {:conditions => ["LOWER(name_on_paper) LIKE :s OR LOWER(email) LIKE :s", {:s => s}],
+ :order => 'name_on_paper'
+ }
+ }
+
+ def name
+ return self.name_on_paper
+ end
+
+ def <=>(authorship)
+ name.downcase <=> authorship.name.downcase
+ end
+
+ def mail
+ return self.email
+ end
+
+ protected
+ def associate_author_user
+ case self.identify_author
+ when "no"
+ author = Author.new
+ author.save
+ self.author_id = author.id
+ else
+ selected = self.search_results
+ selected_classname = Kernel.const_get(selected.split('_')[0])
+ selected_id = selected.split('_')[1]
+ object = selected_classname.find(selected_id)
+
+ if object.respond_to? :name_on_paper
+ # Authorship
+ self.author_id = object.author.id
+ else
+ # User
+ unless object.author.nil?
+ self.author_id = object.author.id
+ else
+ author = Author.new
+ object.author = author
+ object.save
+ self.author_id = object.author.id
+ end
+ end
+ end
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/models/bibtex_entry.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/models/bibtex_entry.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,16 @@
+class BibtexEntry < ActiveRecord::Base
+ unloadable
+
+ belongs_to :publication
+ validates_presence_of :entry_type
+
+ def entry_type_name
+ entry_type = self.entry_type
+ BibtexEntryType.find(entry_type).name
+ end
+
+ def entry_type_label
+ entry_type = self.entry_type
+ BibtexEntryType.find(entry_type).label
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/models/bibtex_entry_type.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/models/bibtex_entry_type.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,30 @@
+class BibtexEntryType < ActiveRecord::Base
+ unloadable
+
+ @@fields = Hash['article', ['journal', 'year', 'volume', 'number', 'pages', 'month', 'note' ],
+ 'book' , [ 'editor', 'publisher', 'volume', 'series', 'address', 'edition', 'month', 'year', 'note' ],
+ 'booklet' , [ 'howpublished', 'address', 'year', 'month', 'note', 'key' ],
+ 'conference', [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ],
+ 'inbook', [ 'editor', 'publisher', 'chapter', 'pages', 'volume', 'series', 'address', 'edition', 'year', 'note' ],
+ 'incollection', [ 'editor', 'publisher', 'chapter', 'pages', 'volume', 'series', 'address', 'edition', 'year', 'note' ],
+ 'inproceedings', [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ],
+ 'manual', [ 'organization', 'address', 'edition', 'month', 'year', 'note' ],
+ 'masterthesis', [ 'school', 'year', 'address', 'month', 'note' ],
+ 'misc', [ 'howpublished', 'month', 'year', 'note' ],
+ 'phdthesis', [ 'school', 'year', 'address', 'month', 'note' ],
+ 'proceedings', [ 'booktitle', 'year', 'editor', 'pages', 'organization', 'publisher', 'address', 'month', 'note' ],
+ 'techreport', [ 'year', 'type', 'number', 'address', 'month', 'note' ],
+ 'unpublished', [ 'note', 'month', 'year' ]]
+
+ def redundant?
+ name == 'conference' # conference is a duplicate of inproceedings
+ end
+
+ def label
+ l("field_bibtex_#{name}")
+ end
+
+ def self.fields (type)
+ @@fields[ self.find(type).name ]
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/models/publication.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/models/publication.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,91 @@
+# vendor/plugins/redmine_bibliography/app/models/publication.rb
+
+class Publication < ActiveRecord::Base
+ unloadable
+
+ has_many :authorships, :dependent => :destroy, :order => "auth_order ASC"
+ has_many :authors, :through => :authorships, :uniq => true
+
+ has_one :bibtex_entry, :dependent => :destroy
+
+ validates_presence_of :title
+ validates_length_of :authorships, :minimum => 1, :message => l("error_no_authors")
+
+ accepts_nested_attributes_for :authorships
+ accepts_nested_attributes_for :authors, :allow_destroy => true
+ accepts_nested_attributes_for :bibtex_entry, :allow_destroy => true
+
+ has_and_belongs_to_many :projects, :uniq => true
+
+ before_save :set_initial_author_order
+
+ # Ensure error message uses proper text instead of
+ # bibtex_entry.entry_type (#268). There has to be a better way to
+ # do this!
+ def self.human_attribute_name(k)
+ if k == 'bibtex_entry.entry_type'
+ l(:field_entry_type)
+ else
+ super
+ end
+ end
+
+ def notify_authors_publication_added(project)
+ self.authors.each do |author|
+ Rails.logger.debug { "Sending mail to \"#{self.title}\" publication authors." }
+ Mailer.deliver_publication_added(author.user, self, project) unless author.user.nil?
+ end
+ end
+
+ def notify_authors_publication_updated(project)
+ self.authors.each do |author|
+ Rails.logger.debug { "Sending mail to \"#{self.title}\" publication authors." }
+ Mailer.deliver_publication_updated(author.user, self, project) unless author.user.nil?
+ end
+ end
+
+
+ def set_initial_author_order
+ authorships = self.authorships
+
+ logger.debug { "Publication \"#{self.title}\" has #{authorships.size} authors." }
+
+ authorships.each_with_index do |authorship, index|
+ if authorship.auth_order.nil?
+ authorship.auth_order = index
+ end
+ end
+ end
+
+ def print_bibtex_author_names
+ # this authors are correctly sorted because the authorships model
+ # already outputs the author names ASC by auth_order
+ self.authorships.map{|a| a.name_on_paper}.join(' and ')
+ end
+
+ def print_entry(style)
+ bib = BibTeX::Entry.new
+
+ bib.author = self.print_bibtex_author_names
+ bib.title = self.title
+
+ self.bibtex_entry.attributes.keys.sort.each do |key|
+ value = self.bibtex_entry.attributes[key].to_s
+ next if key == 'id' or key == 'publication_id' or value == ""
+
+ if key == "entry_type"
+ bib.type = BibtexEntryType.find(self.bibtex_entry.entry_type).name
+ else
+ bib[key.to_sym] = value
+ end
+ end
+
+ if style == :ieee
+ CiteProc.process bib.to_citeproc, :style => :ieee, :format => :html
+ else
+ bibtex = bib.to_s :include => :meta_content
+ bibtex.strip!
+ logger.error { bibtex }
+ end
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/authors/index.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/authors/index.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,26 @@
+<%=l(:label_authors_index)%>
+
+
+
+ <%=l(:field_author_name)%>
+ <%=l(:field_author_username)%>
+ <%=l(:field_author_publications)%>
+
+
+
+ <% @authors.each do |author|%>
+
+
+ <%= link_to_author author %>
+
+
+ <%= link_to author.user unless author.user.nil? %>
+
+
+ <%= render_author_publications(author) %>
+
+
+ <% end %>
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/authors/show.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/authors/show.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,28 @@
+<%=l(:label_authors_show)%>
+
+
+
+<% content_for :sidebar do %>
+<% end %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/authorships/update.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/authorships/update.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+Authorships#update
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/mailer/publication_added.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/mailer/publication_added.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+<%= l(:mail_body_publication_added, :publication => @publication.title, :project => @project.name) %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/mailer/publication_added.text.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/mailer/publication_added.text.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,2 @@
+<%= l(:mail_body_publication_added, :publication => @publication.title, :project => @project.name) %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/my/blocks/_publications_box.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/my/blocks/_publications_box.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,30 @@
+<% get_my_publications %>
+
+<%=l(:label_my_publications_box) %> <%= "(" + @my_publications.count.to_s + ")" %>
+
+
+
+ <%=l(:field_publication_title)%>
+ <%=l(:field_publication_authors)%>
+ <%=l(:field_publication_projects)%>
+
+
+
+ <% @my_publications.each do |publication|%>
+
+
+ <%= link_to publication.title, publication %>
+
+
+ <%= render_publications_authors(publication) %>
+
+
+ <%= render_publications_projects(publication) %>
+
+
+ <% end %>
+
+
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/projects/_bibliography_box.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/projects/_bibliography_box.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,29 @@
+<% content_for :header_tags do %>
+ <%= stylesheet_link_tag 'bibliography', :plugin => 'redmine_bibliography' %>
+ <%= javascript_include_tag 'bibtex', :plugin => 'redmine_bibliography' -%>
+<% end %>
+
+<% if @project.publications.any? %>
+<%= stylesheet_link_tag 'bibliography', :plugin => 'redmine_bibliography' %>
+
+
+
<%=l(:label_related_publication_plural)%>
+
+
+ <% @project.publications.each do |publication| %>
+
+ <%= print_ieee_format(publication) %>
+
+
+ <%= link_to("[More Details]", {:controller => :publications, :action => :show, :id => publication.id, :project_id => @project.id}) -%>
+
+ <%= link_to_function "[BIB TE X]", onclick="toggleBibtex(this)" -%>
+
+
+
+
+ <% end -%>
+
+
+
+<% end -%>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/projects/show.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/projects/show.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,120 @@
+
+ <% if User.current.allowed_to?(:add_subprojects, @project) %>
+ <%= link_to l(:label_subproject_new), {:controller => 'projects', :action => 'new', :parent_id => @project}, :class => 'icon icon-add' %>
+ <% end %>
+
+ <% if @project.module_enabled? :redmine_bibliography %>
+ <% if User.current.allowed_to?(:add_publication, @project) %>
+ <%= link_to l(:label_add_publication_to_project), {:controller => 'publications', :action => 'new', :project_id => @project}, :class => 'icon icon-add' %>
+ <% end %>
+ <% end %>
+
+
+<% if @project.has_welcome_page %>
+<% page = @project.wiki.find_page("Overview") %>
+<% end %>
+
+<% if page %>
+
+<% if @project.module_enabled? :wiki %>
+<% if User.current.allowed_to?(:edit_wiki_pages, @project) %>
+
+<%= link_to(l(:button_welcome_page_edit_this), {:controller => 'wiki', :action => 'edit', :project_id => @project, :id => Wiki.titleize("Overview")}, :class => 'icon icon-edit') %>
+
+<% end %>
+<% end %>
+
+
+
+<% unless @project.homepage.blank? %><%=l(:field_homepage)%>: <%= auto_link(h(@project.homepage)) %> <% end %>
+<% if @subprojects.any? %>
+ <%=l(:label_subproject_plural)%>:
+ <%= @subprojects.collect{|p| link_to(h(p), :action => 'show', :id => p)}.join(", ") %>
+<% end %>
+
+
+
+<%= render(:partial => "wiki/content", :locals => {:content => page.content_for_version()}) %>
+
+<% else %>
+
+<%=l(:label_overview)%>
+
+
+
+ <%= textilizable @project.description %>
+
+
+ <% unless @project.homepage.blank? %><%=l(:field_homepage)%>: <%= auto_link(h(@project.homepage)) %> <% end %>
+ <% if @subprojects.any? %>
+ <%=l(:label_subproject_plural)%>:
+ <%= @subprojects.collect{|p| link_to(h(p), :action => 'show', :id => p)}.join(", ") %>
+ <% end %>
+ <% @project.visible_custom_field_values.each do |custom_value| %>
+ <% if !custom_value.value.blank? %>
+ <%= custom_value.custom_field.name%>: <%=h show_value(custom_value) %>
+ <% end %>
+ <% end %>
+
+
+ <% if User.current.allowed_to?(:view_issues, @project) %>
+
+
<%=l(:label_issue_tracking)%>
+
+ <% for tracker in @trackers %>
+ <%= link_to tracker.name, :controller => 'issues', :action => 'index', :project_id => @project,
+ :set_filter => 1,
+ "tracker_id" => tracker.id %>:
+ <%= l(:label_x_open_issues_abbr_on_total, :count => @open_issues_by_tracker[tracker].to_i,
+ :total => @total_issues_by_tracker[tracker].to_i) %>
+
+ <% end %>
+
+
+ <%= link_to l(:label_issue_view_all), :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1 %>
+ <% if User.current.allowed_to?(:view_calendar, @project, :global => true) %>
+ | <%= link_to(l(:label_calendar), :controller => 'calendars', :action => 'show', :project_id => @project) %>
+ <% end %>
+ <% if User.current.allowed_to?(:view_gantt, @project, :global => true) %>
+ | <%= link_to(l(:label_gantt), :controller => 'gantts', :action => 'show', :project_id => @project) %>
+ <% end %>
+
+
+ <% end %>
+ <%= call_hook(:view_projects_show_left, :project => @project) %>
+
+
+
+
+ <%= render :partial => 'bibliography_box' %>
+
+ <%= render :partial => 'members_box' %>
+
+ <% if @news.any? && authorize_for('news', 'index') %>
+
+
<%=l(:label_news_latest)%>
+ <%= render :partial => 'news/news', :collection => @news %>
+
<%= link_to l(:label_news_view_all), :controller => 'news', :action => 'index', :project_id => @project %>
+
+ <% end %>
+ <%= call_hook(:view_projects_show_right, :project => @project) %>
+
+
+<% content_for :sidebar do %>
+ <%= call_hook(:view_projects_show_sidebar_top, :project => @project) %>
+ <% if @total_hours && User.current.allowed_to?(:view_time_entries, @project) %>
+ <%= l(:label_spent_time) %>
+ <%= l_hours(@total_hours) %>
+ <%= link_to(l(:label_details), {:controller => 'timelog', :action => 'index', :project_id => @project}) %> |
+ <%= link_to(l(:label_report), {:controller => 'time_entry_reports', :action => 'report', :project_id => @project}) %>
+ <% end %>
+ <%= call_hook(:view_projects_show_sidebar_bottom, :project => @project) %>
+<% end %>
+
+<% end %>
+
+<% content_for :header_tags do %>
+<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :id => @project, :format => 'atom', :key => User.current.rss_key}) %>
+<% end %>
+
+<% html_title(l(:label_overview)) -%>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/_add_project_form.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_add_project_form.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,29 @@
+<% form_remote_for(:publication,
+ :url => {:controller => 'publications', :action => 'add_project', :id => @publication, :project_id => @project},
+ :method => :post,
+ :html => { :id => 'add_project_form' },
+ :loading => "$('project-add-submit').disable()",
+ :complete => "$('project-add-submit').enable()") do |f| %>
+ <%=l(:label_add_project_to_publication)%>
+
+ <%= label_tag "project_search", l(:label_project_search) %><%= text_field_tag 'project_search', nil %>
+
+
+ <%= observe_field(:project_search,
+ :frequency => 0.5,
+ :update => :projects,
+ :url => { :controller => 'publications', :action => 'autocomplete_for_project', :id => @publication },
+ :with => 'q')
+ %>
+
+
+ <% if params[:q] && params[:q].length > 1 %>
+ <%= projects_check_box_tags 'project[project_ids][]', @projects %>
+ <% end %>
+
+
+ <%= submit_tag l(:button_add), :id => 'project-add-submit' %>
+
+
+
+ <% end %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/_authorship_fields.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_authorship_fields.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,58 @@
+<%= stylesheet_link_tag 'bibliography', :plugin => 'redmine_bibliography' %>
+
+
+
+
+
+
>
+
+ <%= f.text_field :search_name, :size => 25 %>
+ <%= observe_field( form_tag_id(f.object_name, :search_name), :frequency => 0.5, :update => form_tag_id( f.object_name, :search_results), :url => { :controller => 'publications', :action => 'autocomplete_for_author', :object_name => form_object_id(f.object_name) }, :with => 'q' ) %>
+
+ <%# link_to_function l(:label_author_is_me), "update_author_info(this," + User.current.get_author_info.to_json + ")", :id => "add_me_as_author" %>
+
+
+ <%= f.select :search_results, options_for_select(@author_options), {}, {:size => 5,
+ :onChange => remote_function( :url => { :controller => :publications, :action => :get_user_info, :object_id => form_object_id(f.object_name) }, :with => "'value=' +
+ value" )} %>
+
+
+
<%= l(:identify_author_question) %>
+
+ <%= radio_button_tag(:identify_author, "yes", false, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_yes ), :onchange => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_yes) %>
+
+ <%= radio_button_tag(:identify_author, "correct", false, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_corrections ), :onchange => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_correct) %>
+
+ <%= radio_button_tag(:identify_author, "no", true, :name => form_tag_name(f.object_name,:identify_author ), :id => form_tag_id( f.object_name, :identify_author_no ), :onchange => "identify_author_status($(this).value, #{form_object_id(f.object_name) });") %> <%= l(:identify_author_no) %>
+
+
+
+
+
+
+
+
+
+
+
+
+ <%- if params[:action] == 'new' -%>
+ <%= button_to_function l(:label_save_author), {}, { :onclick => "toggle_save_author(#{form_object_id(f.object_name)}); return false;", :id => form_tag_id( f.object_name, :edit_save_button )} %>
+ <%- else -%>
+ <%= button_to_function l(:label_edit_author), {}, { :onclick => "toggle_save_author(#{form_object_id(f.object_name)}); return false;", :id => form_tag_id( f.object_name, :edit_save_button )} %>
+ <%- end -%>
+
+
+ <%= link_to_remove_fields l("remove_author"), f %>
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/_bibtex_fields.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_bibtex_fields.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,80 @@
+
+ <%=l("field_entry_type")%> *
+ <%= f.collection_select :entry_type,
+ BibtexEntryType.find(:all).reject { |x| x.redundant? },
+ :id,
+ :label,
+ { :selected => @selected_bibtex_entry_type_id, :prompt => true },
+ :onChange => remote_function( :url => { :controller => :publications, :action => :get_bibtex_required_fields}, :with => "'value=' + value" )
+ %>
+
+
+
+ <%= f.text_field :year, :size => 4 %>
+
+
+ <%= f.text_field :month, :size => 4%>
+
+
+ <%= f.text_field :chapter, :size => 15%>
+
+
+ <%= f.text_field :editor, :size => 33 %>
+
+
+ <%= f.text_field :booktitle, :size => 33 %>
+
+
+ <%= f.text_field :publisher,:size => 33 %>
+
+
+ <%= f.text_field :pages, :size => 12 %>
+
+
+ <%= f.text_field :address %>
+
+
+ <%= f.text_field :annote %>
+
+
+ <%= f.text_field :crossref %>
+
+
+ <%= f.text_field :edition %>
+
+
+ <%= f.text_field :eprint %>
+
+
+ <%= f.text_field :howpublished %>
+
+
+ <%= f.text_field :journal %>
+
+
+ <%= f.text_field :key %>
+
+
+ <%= f.text_field :note %>
+
+
+ <%= f.text_field :number %>
+
+
+ <%= f.text_field :organization %>
+
+
+ <%= f.text_field :school %>
+
+
+ <%= f.text_field :series %>
+
+
+ <%= f.text_field :type %>
+
+
+ <%= f.text_field :url %>
+
+
+ <%= f.text_field :volume %>
+
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/_form.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_form.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,36 @@
+<%= f.error_messages %>
+
+<%= f.text_field :title, :required => true, :size => 70 %>
+
+
+
<%= l(:label_publication_other_details) %>
+
+ <% f.fields_for :bibtex_entry do |builder| -%>
+ <%= render :partial => 'bibtex_fields', :locals => { :f => builder} %>
+ <%- end -%>
+
+
+ <%= f.text_field :external_url, :size => 70 %>
+
+ <%= l(:text_external_url) %>
+
+
+ <%= f.text_field :doi, :size => 70 %>
+
+ <%= l(:text_doi) %>
+
+
+
+
+
+
+
<%= l(:authors) %>
+
+ <% f.fields_for :authorships do |builder| -%>
+ <%= render "authorship_fields", :f => builder %>
+ <%- end -%>
+ <%= link_to_add_author_fields l(:label_add_an_author), f, :authorships, params[:action] %>
+
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/_identify_author_form.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_identify_author_form.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,25 @@
+<%= "Identify Authors in the system…" %>
+
+<%= link_to_remote "It's me!",
+ { :url => { :controller => 'publications',
+ :action => 'add_me_as_author',
+ :project_id => @project }, :method => 'post'},
+ { :class => 'icon icon-add', :id => "add_me_as_author" } %>
+
+
+ <%= label_tag "author_search", l(:label_project_search) %><%= text_field_tag 'author_search', nil %>
+
+
+<%= observe_field( form_tag_id(f.object_name, :name),
+ :frequency => 0.5,
+ :update => :identify_author,
+ :url => { :controller => 'publications', :action => 'autocomplete_for_author' },
+ :with => 'q')
+%>
+
+
+ <% if params[:q] && params[:q].length > 1 %>
+ <%= select_author_links 'author[author_ids][]', @authors %>
+ <% end %>
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/_list_projects.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_list_projects.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+<%= render_projects_list(@publication, true) %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/_new_bibtex_step.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_new_bibtex_step.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,9 @@
+New Bibtex
+
+Paste your Bibtex entries here
+
+ <%=label_tag :bibtex_entry %>
+ <%=text_area_tag :bibtex_entry%>
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/_review_bibtex_step.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/_review_bibtex_step.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,2 @@
+Review new entries
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/add_project.rjs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/add_project.rjs Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,3 @@
+page.replace_html :list_projects, :partial => 'list_projects'
+page[:add_project_form].reset
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/autocomplete_for_author.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/autocomplete_for_author.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,4 @@
+<% if params[:q] && params[:q].length > 1 %>
+ <%= choose_author_link @object_name, @results %>
+<% end %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/autocomplete_for_project.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/autocomplete_for_project.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,3 @@
+<% if params[:q] && params[:q].length > 1 %>
+ <%= projects_check_box_tags 'publication[project_ids][]', @projects %>
+<% end %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/create.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/create.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+Publications#create
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/edit.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/edit.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,18 @@
+<% content_for :header_tags do %>
+ <%= javascript_include_tag 'authors', :plugin => 'redmine_bibliography' %>
+ <%= stylesheet_link_tag 'bibliography', :plugin => 'redmine_bibliography' %>
+ <%= javascript_tag 'Event.observe(window, "load", function(e){show_required_bibtex_fields(' + @bibtype_fields.to_json + ')});' %>
+<% end %>
+
+<%=l(:label_publication_show)%>
+
+<% form_for @publication, :url => { :project_id => @project, :action => :update }, :builder => TabularFormBuilder do |f| -%>
+ <%= render :partial => 'form', :locals => { :f => f } %>
+
+
+ <%= f.submit %>
+<% end %>
+
+ <%= link_to l(:label_publication_show), { :controller => "publications", :action => "show", :id => @publication, :project_id => @project_id } %> |
+ <%= link_to l(:label_publication_index), { :controller => "publications", :action => "index", :project_id => @project } %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/import.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/import.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,12 @@
+New Publication
+
+<% form_for @publication, :url => { :action => "create" } do |f| %>
+ <% f.error_messages %>
+
+ <%= render :partial => "#{@publication.current_step}_bibtex_step", :locals => { :f => f } %>
+
+ <%= f.submit "Submit" %>
+ <%= f.submit "Back", :name => "back_button" unless @publication.first_step? %>
+
+<% end %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/index.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/index.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,40 @@
+
+ <% if User.current.allowed_to?(:add_publication, @project) %>
+ <%= link_to l(:label_publication_new), {:controller => 'publications', :action => 'new', :project_id => @project}, :class => 'icon icon-add' %>
+ <% end %>
+
+
+ <% if @project %>
+ <%= l(:label_all_publications_for_project, :project => @project.name) %>
+ <% else %>
+ <%= l(:label_all_publications) %>
+ <% end %>
+
+
+
+<% content_for :sidebar do %>
+<% end %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/new.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/new.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,12 @@
+<% content_for :header_tags do %>
+ <%= javascript_include_tag 'authors', :plugin => 'redmine_bibliography' %>
+ <%= stylesheet_link_tag 'bibliography', :plugin => 'redmine_bibliography' %>
+<% end %>
+
+<%=l(:label_publication_new)%>
+
+<% form_for @publication, :url => { :project_id => @project, :action => :create }, :builder => TabularFormBuilder do |f| -%>
+ <%= render :partial => 'form', :locals => { :f => f } %>
+
+ <%= f.submit %>
+<% end %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/show.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/show.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,67 @@
+<%=l(:label_publication_show)%>
+
+
+
Publication Info
+
<%= print_ieee_format(@publication)%>
+
+
BIB TE X Format
+
<%=h print_bibtex_format(@publication) %>
+
+
+
+
+
<%= l(:authors) %>
+
+ <% for authorship in @publication.authorships.find(:all, :order => :auth_order) %>
+ <% content_tag_for :li, authorship do %>
+ <%- if User.current.allowed_to?(:edit_publication, @project) && @publication.authorships.length > 1 -%>
+ [drag to reorder]
+ <%- end -%>
+ <%= link_to_authorship authorship %> <%= h authorship.institution %>
+ <%- end -%>
+ <%- end -%>
+
+
+<%- if User.current.allowed_to?(:edit_publication, @project) && @publication.authorships.length > 1 -%>
+ <%= sortable_element("authorships", :url => { :controller => :publications, :action => :sort_author_order }, :handle => "handle") %>
+<%- end -%>
+
+<%- if @publication.bibtex_entry != nil -%>
+ <%= show_bibtex_fields(@publication.bibtex_entry) %>
+<%- end -%>
+
+<%- unless @publication.external_url.blank? -%>
+
+ <%= l(:field_external_url) %>: <%= link_to h(@publication.external_url), @publication.external_url, {:target => "_blank"} -%>
+
+<%- end -%>
+
+
+<% unless @publication.doi.blank? %>
+
+ <%= l(:field_doi)-%>: <%= link_to h(@publication.doi), "http://dx.doi.org/#{@publication.doi}", {:target => "_blank"} -%>
+
+<% end %>
+
+
+ <% if User.current.allowed_to?(:add_publication, @project) %>
+ <%= link_to l(:label_publication_edit), { :controller => "publications", :action => "edit", :id => @publication, :project_id => @project } %> |
+ <%= link_to "Delete", {:controller => 'publications', :action => 'destroy', :id => @publication, :project_id => @project },
+ :confirm => l(:text_are_you_sure), :method => :delete, :title => l(:button_delete) %> |
+ <% end %>
+ <%= link_to l(:view_all_publications), {:controller => 'publications', :action => 'index', :project_id => @project } %>
+
+
+<% projects = Project.active.find(:all, :limit => 100, :order => 'name ASC') - @publication.projects %>
+
+<% content_for :sidebar do %>
+ <%=l(:label_publication_project_index)%>
+
+
+ <%= render :partial => 'list_projects' %>
+
+
+ <%- if User.current.allowed_to?(:edit_publication, @project) -%>
+ <%= render :partial => 'add_project_form' %>
+ <%- end -%>
+<% end %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/publications/update.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/publications/update.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+Publications#update
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/settings/_bibliography.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/settings/_bibliography.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,3 @@
+Menu caption
+<%= text_field_tag 'settings[menu]', @settings['menu'], :size => 30 %>
+Clear this field if you don't want to add a tab to the project menu
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/app/views/users/show.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/app/views/users/show.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,104 @@
+<%= stylesheet_link_tag 'bibliography', :plugin => 'redmine_bibliography' %>
+
+
+<%= link_to(l(:button_edit), edit_user_path(@user), :class => 'icon icon-edit') if User.current.admin? %>
+
+
+<%= avatar @user, :size => "50" %> <%=h @user.name %>
+
+
+
+ <% unless @user.pref.hide_mail %>
+ <%=l(:field_mail)%>: <%= mail_to(h(@user.mail), nil, :encode => 'javascript') %>
+ <% end %>
+ <% @user.visible_custom_field_values.each do |custom_value| %>
+ <% if !custom_value.value.blank? %>
+ <%=h custom_value.custom_field.name%>: <%=h show_value(custom_value) %>
+ <% end %>
+ <% end %>
+ <%=l(:label_registered_on)%>: <%= format_date(@user.created_on) %>
+ <% unless @user.last_login_on.nil? %>
+ <%=l(:field_last_login_on)%>: <%= format_date(@user.last_login_on) %>
+ <% end %>
+
+
+
<%=l(:label_ssamr_description)%>
+<%= textilizable @description %>
+
+
<%=l(:label_ssamr_institution)%>
+
<%= h @institution_name %>
+
+
+<% unless @memberships.empty? %>
+
<%=l(:label_project_plural)%>
+
+<% for membership in @memberships %>
+ <%= link_to_project(membership.project) %>
+ (<%=h membership.roles.sort.collect(&:to_s).join(', ') %>, <%= format_date(membership.created_on) %>)
+<% end %>
+
+<% end %>
+<%= call_hook :view_account_left_bottom, :user => @user %>
+
+
+
+
+ <% if @user.author %>
+
+ <% @publications = Publication.all(:include => :authors, :conditions => "authors.id = #{@user.author.id}") %>
+
+
<%=l(:publications) %> <%= "(" + @publications.count.to_s + ")" %>
+
+ <% @publications.each do |publication|%>
+
+
+ <%= publication.authorships.map { |a| h a.name_on_paper }.join(', ') %><% if !publication.authorships.empty? %>.<% end %>
+
+ <%= link_to publication.title, :controller => 'publications', :action => 'show', :id => publication %>
+ <% if publication.bibtex_entry.year.to_s != "" %>
+
+ (<%= publication.bibtex_entry.year %>)
+
+ <% end %>
+
+
+
+ <% end %>
+
+ <% end %>
+
+
+<% unless @events_by_day.empty? %>
+
<%= link_to l(:label_activity), :controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :from => @events_by_day.keys.first %>
+
+
+<%=l(:label_reported_issues)%>: <%= Issue.count(:conditions => ["author_id=?", @user.id]) %>
+
+
+
+<% @events_by_day.keys.sort.reverse.each do |day| %>
+
<%= format_activity_day(day) %>
+
+<% @events_by_day[day].sort {|x,y| y.event_datetime <=> x.event_datetime }.each do |e| -%>
+
+ <%= format_time(e.event_datetime, false) %>
+ <%= content_tag('span', h(e.project), :class => 'project') %>
+ <%= link_to format_activity_title(e.event_title), e.event_url %>
+ <%= format_activity_description(e.event_description) %>
+<% end -%>
+
+<% end -%>
+
+
+<% other_formats_links do |f| %>
+ <%= f.link_to 'Atom', :url => {:controller => 'activities', :action => 'index', :id => nil, :user_id => @user, :key => User.current.rss_key} %>
+<% end %>
+
+<% content_for :header_tags do %>
+ <%= auto_discovery_link_tag(:atom, :controller => 'activities', :action => 'index', :user_id => @user, :format => :atom, :key => User.current.rss_key) %>
+<% end %>
+<% end %>
+<%= call_hook :view_account_right_bottom, :user => @user %>
+
+
+<% html_title @user.name %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/assets/javascripts/authors.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/assets/javascripts/authors.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,76 @@
+function remove_fields(link) {
+ $(link).previous("input[type=hidden]").value = "1";
+ $(link).up(".fields").hide();
+}
+
+function add_author_fields(link, association, content, action) {
+ var new_id = new Date().getTime();
+ var regexp = new RegExp("new_" + association, "g");
+ $(link).insert({
+ before: content.replace(regexp, new_id)
+ });
+ if(action != "new"){
+ toggle_save_author(new_id, $(link));
+ };
+}
+
+function identify_author_status(status, object_id) {
+ $('publication_authorships_attributes_' + object_id + '_edit_author_info').select('input').each(function(s) {
+ if(status == "no"){
+ s.value = "";
+ s.readOnly = false;
+ };
+
+ if(status == "correct"){s.readOnly = false;};
+ if(status == "yes"){s.readOnly = true;};
+ });
+}
+
+function toggle_div(div_id){
+ Effect.toggle(div_id, "appear", {duration:0.3});
+}
+
+function toggle_input_field(field){
+ if (field.classNames().inspect().include("readonly") == false){
+ field.readOnly = true;
+ field.addClassName('readonly');
+ } else {
+ field.readOnly = false;
+ field.removeClassName('readonly');
+ };
+}
+
+function toggle_edit_save_button(object_id){
+ $button = $('publication_authorships_attributes_' + object_id + '_edit_save_button');
+ if ($button.value == "Edit author"){
+ $button.value = "Save author";
+ } else {
+ $button.value = "Edit author";
+ };
+}
+
+function toggle_save_author(form_object_id, $this){
+ $('publication_authorships_attributes_' + form_object_id + '_edit_author_info').select('input').each(function(s) {
+ toggle_input_field(s, $this);
+ });
+ $('publication_authorships_attributes_' + form_object_id + '_edit_author_info').select('p.description').each(function(s) {
+ s.toggle();
+ });
+ toggle_edit_save_button(form_object_id);
+ toggle_div("publication_authorships_attributes_" + form_object_id +"_search_author");
+}
+
+function hide_all_bibtex_required_fields(){$$('p.bibtex').each(function(s){s.hide()})}
+
+// entrytype_fields is a jsno array with the fields requires by the selected bibtex entry
+function show_required_bibtex_fields(entrytype_fields) {
+ $$('p.bibtex').each(function(s){
+ if(entrytype_fields.indexOf(s.down('input').id.split('_').last()) != -1){
+ s.show();
+ }
+ else {
+ s.hide();
+ }
+ })
+}
+
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/assets/javascripts/bibtex.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/assets/javascripts/bibtex.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,6 @@
+function toggleBibtex(el) {
+ var dd = Element.up(el).next('dd')
+
+ dd.toggleClassName('collapsed');
+ Effect.toggle(dd, 'slide', {duration:0.2});
+}
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/assets/stylesheets/bibliography.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/assets/stylesheets/bibliography.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,63 @@
+li .handle {
+ font-size: 12px;
+ cursor: move;
+ color: #777;
+}
+
+input.readonly {
+ border: none;
+ padding: 0;
+ margin: 0;
+ background-color: transparent;
+}
+
+.tabular .author_identify label {
+ font-weight: normal;
+}
+
+.tabular .author_edit p {
+ padding-bottom: 0;
+}
+
+.tabular .author_edit .description {
+ padding-top: 0;
+ font-style: italic;
+}
+
+.publication_project {
+ margin-right: 18px;
+}
+
+#authors select {
+ min-width: 150px;
+}
+
+
+div#bibliography dd { margin-bottom: 1em; font-size: 0.9em; }
+
+div#bibliography dd .authors { font-style: italic; }
+div#bibliography dd span.authors { color: #808080; }
+div#bibliography dd span.year { padding-left: 0.6em; }
+
+div#bibliography .box dt {
+ background: url(../../../images/document.png) no-repeat 0% 4px;
+ padding-left: 20px;
+ margin-left: 0;
+}
+div#bibliography .box dd {
+ padding-left: 20px;
+ margin-left: 0;
+}
+
+div#bibliography h3 {
+ background: url(../../../images/table_multiple.png) no-repeat 0% 50%;
+ padding-left: 20px;
+}
+
+div#bibliography textarea {
+ width: 90%;
+ height: 200px;
+ font: normal 8px;
+ padding: 2px 10px;
+ border: solid 1px #ddd;
+}
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/config/locales/en.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/config/locales/en.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,152 @@
+# English strings go here for Rails i18n
+en:
+ project_module_redmine_bibliography: "Publications (references to papers related to the project)"
+
+ title: "Title"
+ authors: "Authors"
+ author: "Author"
+ name: "Name"
+ year: "Year"
+ associated_projects: "Associated Projects"
+ publications_box: "My Publications"
+ label_my_publications_box: "My Publications"
+ view_all_publications: "View All Project's Publications"
+ publications: Publications
+
+ identify_author_question: Is the right person selected above?
+ identify_author_yes: "Yes"
+ identify_author_correct: "Yes, but I need to correct some details below"
+ identify_author_no: "No, the author was not found in the search"
+
+ error_no_authors: "Please add at least one author to this publication."
+
+ label_all_publications: All Publications
+ label_all_publications_for_project: Publications associated with %{project}
+ label_authors_show: "Authorships associated with this author"
+ label_authors_index: "List of authors"
+
+ field_authorship_publication_title: "Publication"
+ field_authorship_name: "Name on Paper"
+ field_authorship_email: "Email"
+ field_authorship_institution: "Institution"
+
+ field_external_url: "External URL"
+ field_doi: "DOI"
+ field_publication_title: Title
+ field_publication_authors: Authors
+ field_publication_projects: "Associated projects"
+ field_author_name: Author
+ field_author_user: User Name
+ field_author_username: "Associated user"
+ field_author_publications: "Publications by this Author"
+ field_identify_author_yes: "Yes"
+ field_identify_author_correct: "Corrections"
+ field_identify_author_no: "No"
+
+ label_author_is_me: "(I am this author)"
+ label_add_me_as_author: "Add me as an author"
+ label_add_an_author: "Add an author"
+ label_add_another_author: "Add another author"
+ field_search_name: "Search by name"
+ field_search_results: ""
+ label_save_author: "Save author"
+ label_edit_author: "Edit author"
+ label_author_information: "Author Information"
+
+ remove_author: "Remove this author"
+
+ label_publication_plural: "Publications"
+ label_related_publication_plural: "Related publications"
+ label_publication_new: "Create New Publication"
+ label_publication_index: "List of Publication"
+ label_add_publication_to_project: "Add publication to this project"
+ label_publication_edit: "Edit Publication"
+ label_publication_show: "Publication Details"
+ label_add_project_to_publication: "Add this publication to a project"
+ label_project_search: "Find project by name: "
+ label_publication_project_index: "Projects associated with this publication"
+ label_publication_index: "View all publications"
+ label_publication_other_details: "Details"
+
+ text_external_url: "Link to the publication or to an external page about it."
+ text_doi: "DOI (Digital Object Identifier)."
+ text_author_name_on_paper: "Author's name as it appears on the paper."
+ text_author_institution: "Author's institution as on the paper."
+ text_author_email: "Author's email address as on the paper."
+
+ text_author_search: "Search existing authors"
+
+ # authorships model
+ field_institution: "Institution"
+ field_name_on_paper: "Name"
+ field_email: "Email Address"
+
+ # bibtex_entries model
+ field_entry_type: "Publication Type"
+ field_id: "id"
+ field_publication_id: "Publication_id"
+ field_address: "Address"
+ field_annote: "Annote"
+ field_booktitle: "Title of Book or Proceedings"
+ field_chapter: "Chapter"
+ field_crossref: "Cross Reference"
+ field_edition: "Edition"
+ field_editor: "Editor"
+ field_eprint: "eprint"
+ field_howpublished: "How was it Published"
+ field_journal: "Journal"
+ field_key: "Key"
+ field_month: "Month"
+ field_note: "Note"
+ field_number: "Number"
+ field_organization: "Organization"
+ field_pages: "Pages"
+ field_publisher: "Publisher"
+ field_school: "School"
+ field_series: "Series"
+ field_type: "Type"
+ field_url: "URL"
+ field_volume: "Volume"
+ field_year: "Year"
+
+ field_bibtex_article: Journal article
+ field_bibtex_book: Book
+ field_bibtex_booklet: Booklet
+ field_bibtex_conference: Article in conference proceedings
+ field_bibtex_inbook: Book chapter or part
+ field_bibtex_incollection: Part of a collection
+ field_bibtex_inproceedings: Article in conference proceedings
+ field_bibtex_manual: Technical manual
+ field_bibtex_masterthesis: "Master's thesis"
+ field_bibtex_misc: Other
+ field_bibtex_phdthesis: "PhD thesis"
+ field_bibtex_proceedings: Conference proceedings
+ field_bibtex_techreport: Technical report
+ field_bibtex_unpublished: Unpublished
+
+ label_author_1: First author
+ label_author_2: Second author
+ label_author_3: Third author
+ label_author_4: Fourth author
+ label_author_5: Fifth author
+ label_author_6: Sixth author
+ label_author_7: Seventh author
+ label_author_8: Eighth author
+ label_author_9: Ninth author
+ label_author_10: Tenth author
+ label_author_11: Eleventh author
+ label_author_12: Twelfth author
+ label_author_13: Thirteenth author
+ label_author_14: Fourteenth author
+ label_author_15: Fifteenth author
+ label_author_16: Sixteenth author
+ label_author_17: Seventeenth author
+ label_author_18: Eighteenth author
+ label_author_19: Nineteenth author
+ label_author_20: Twentieth author
+
+ mail_subject_publication_added: "You have been added as an author to a new publication"
+ mail_body_publication_added: "A new publication (%{publication}) has been added to the project '%{project}.'"
+
+
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/config/routes.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/config/routes.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,3 @@
+ActionController::Routing::Routes.draw do |map|
+ map.resources :publications, :collection => { :sort_author_order => :post }
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/001_create_authors.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/001_create_authors.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,12 @@
+class CreateAuthors < ActiveRecord::Migration
+ def self.up
+ create_table :authors do |t|
+ t.column :user_id, :integer
+ t.column :name, :string
+ end
+ end
+
+ def self.down
+ drop_table :authors
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/002_create_publications.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/002_create_publications.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,12 @@
+class CreatePublications < ActiveRecord::Migration
+ def self.up
+ create_table :publications do |t|
+ t.column :title, :string
+ t.column :reviewed, :boolean, :default => false
+ end
+ end
+
+ def self.down
+ drop_table :publications
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/003_create_authorships.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/003_create_authorships.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,16 @@
+class CreateAuthorships < ActiveRecord::Migration
+ def self.up
+ create_table :authorships do |t|
+ t.column :author_id, :integer
+ t.column :publication_id, :integer
+ t.column :name_on_paper, :string
+ t.column :auth_order, :integer
+ t.column :institution, :string
+ t.column :email, :string
+ end
+ end
+
+ def self.down
+ drop_table :authorships
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/004_create_bibtex_entries.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/004_create_bibtex_entries.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,35 @@
+class CreateBibtexEntries < ActiveRecord::Migration
+ def self.up
+ create_table :bibtex_entries do |t|
+ t.column :publication_id, :integer
+ t.column :entry_type, :integer
+ t.column :address, :string
+ t.column :annote, :string
+ t.column :booktitle, :string
+ t.column :chapter, :string
+ t.column :crossref, :string
+ t.column :edition, :string
+ t.column :editor, :string
+ t.column :eprint, :string
+ t.column :howpublished, :string
+ t.column :journal, :string
+ t.column :key, :string
+ t.column :month, :string
+ t.column :note, :text
+ t.column :number, :string
+ t.column :organization, :string
+ t.column :pages, :string
+ t.column :publisher, :string
+ t.column :school, :string
+ t.column :series, :string
+ t.column :type, :string
+ t.column :url, :string
+ t.column :volume, :integer
+ t.column :year, :integer
+ end
+ end
+
+ def self.down
+ drop_table :bibtex_entries
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/005_create_projects_publications_join_table.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/005_create_projects_publications_join_table.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,12 @@
+class CreateProjectsPublicationsJoinTable < ActiveRecord::Migration
+ def self.up
+ create_table :projects_publications, :id => false do |t|
+ t.integer :project_id
+ t.integer :publication_id
+ end
+ end
+
+ def self.down
+ drop_table :projects_publications
+ end
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/006_create_bibtex_entry_types.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/006_create_bibtex_entry_types.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,13 @@
+class CreateBibtexEntryTypes < ActiveRecord::Migration
+ def self.up
+ create_table :bibtex_entry_types do |t|
+ t.string :name
+
+ t.timestamps
+ end
+ end
+
+ def self.down
+ drop_table :bibtex_entry_types
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/007_add_external_url_column_to_publications.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/007_add_external_url_column_to_publications.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,9 @@
+class AddExternalUrlColumnToPublications < ActiveRecord::Migration
+ def self.up
+ add_column :publications, :external_url, :string
+ end
+
+ def self.down
+ remove_column :publications, :external_url
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/008_add_doi_and_timestamp_columns_to_publications.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/008_add_doi_and_timestamp_columns_to_publications.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,12 @@
+class AddDoiAndTimestampColumnsToPublications < ActiveRecord::Migration
+ def self.up
+ add_column :publications, :doi, :string
+ add_timestamps :publications
+
+ end
+
+ def self.down
+ remove_column :publications, :doi
+ remove_timestamps :publications
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/migrate/009_add_timestamp_columns_to_authors.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/migrate/009_add_timestamp_columns_to_authors.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,9 @@
+class AddTimestampColumnsToAuthors < ActiveRecord::Migration
+ def self.up
+ add_timestamps :authors
+ end
+
+ def self.down
+ remove_timestamps :authors
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/db/seed_data/bibtex_entry_types_list.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/db/seed_data/bibtex_entry_types_list.txt Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,14 @@
+inproceedings
+conference
+article
+masterthesis
+phdthesis
+book
+booklet
+inbook
+incollection
+manual
+techreport
+proceedings
+unpublished
+misc
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/init.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/init.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,54 @@
+require 'redmine'
+require 'dispatcher'
+
+require 'bibtex'
+require 'citeproc'
+
+# Patches to the Redmine core.
+Dispatcher.to_prepare :redmine_model_dependencies do
+ require_dependency 'project'
+ require_dependency 'user'
+ require_dependency 'mailer'
+
+ unless Project.included_modules.include? Bibliography::ProjectPublicationsPatch
+ Project.send(:include, Bibliography::ProjectPublicationsPatch)
+ end
+
+ unless User.included_modules.include? Bibliography::UserAuthorPatch
+ User.send(:include, Bibliography::UserAuthorPatch)
+ end
+
+ unless Mailer.included_modules.include? Bibliography::MailerPatch
+ Mailer.send(:include, Bibliography::MailerPatch)
+ end
+
+ unless ProjectsHelper.included_modules.include?(Bibliography::ProjectsHelperPatch)
+ ProjectsHelper.send(:include, Bibliography::ProjectsHelperPatch)
+ end
+end
+
+
+# Plugin Info
+Redmine::Plugin.register :redmine_bibliography do
+ name 'Redmine Bibliography plugin'
+ author 'Chris Cannam, Luis Figueira'
+ description 'This is a bibliography management plugin for Redmine'
+ version '0.0.1'
+ url 'http://example.com/path/to/plugin'
+ author_url 'http://example.com/about'
+
+ settings :default => { 'menu' => 'Publications' }, :partial => 'settings/bibliography'
+
+ project_module :redmine_bibliography do
+ permission :publications, { :publications => :index }, :public => true
+ permission :edit_publication, {:publications => [:edit, :update]}
+ permission :add_publication, {:publications => [:new, :create]}
+ permission :delete_publication, {:publications => :destroy}
+
+ end
+
+ # extending the Project Menu
+ menu :project_menu, :publications, { :controller => 'publications', :action => 'index', :path => nil }, :after => :activity, :param => :project_id, :caption => Proc.new { Setting.plugin_redmine_bibliography['menu'] },
+ :if => Proc.new { !Setting.plugin_redmine_bibliography['menu'].blank? }
+
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/lang/en.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/lang/en.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,2 @@
+# English strings go here
+my_label: "My label"
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/lib/bibliography/mailer_patch.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/lib/bibliography/mailer_patch.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,31 @@
+require_dependency 'mailer'
+
+module Bibliography
+ module MailerPatch
+ def self.included(base) # :nodoc:
+
+ # Builds a tmail object used to email the specified user that a publication was created and the user is
+ # an author of that publication
+ #
+ # Example:
+ # publication_added(user) => tmail object
+ # Mailer.deliver_add_to_project(user) => sends an email to the registered user
+ def publication_added(user, publication, project)
+
+ @publication = publication
+ @project = project
+
+ set_language_if_valid user.language
+ recipients user.mail
+ subject l(:mail_subject_publication_added, Setting.app_title)
+ body :publication_url => url_for( :controller => 'publications', :action => 'show', :id => publication.id ),
+ :publication_title => publication.title
+
+ render_multipart('publication_added', body)
+
+ end
+
+
+ end
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/lib/bibliography/project_publications_patch.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/lib/bibliography/project_publications_patch.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,25 @@
+require_dependency 'project'
+
+module Bibliography
+ module ProjectPublicationsPatch
+ def self.included(base)
+ base.class_eval do
+ has_and_belongs_to_many :publications, :uniq => true
+
+ named_scope :like, lambda {|q|
+ s = "%#{q.to_s.strip.downcase}%"
+ {:conditions => ["LOWER(name) LIKE :s OR LOWER(homepage) LIKE :s", {:s => s}],
+ :order => 'name'
+ }
+ }
+ end
+ end #self.included
+
+ module ProjectMethods
+
+
+
+
+ end #ProjectMethods
+ end #ProjectPublicationsPatch
+end #RedmineBibliography
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/lib/bibliography/projects_helper_patch.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/lib/bibliography/projects_helper_patch.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,17 @@
+module Bibliography
+ module ProjectsHelperPatch
+
+ def self.included(base) # :nodoc:
+ base.send(:include, InstanceMethods)
+ base.send(:include, PublicationsHelper)
+
+ base.class_eval do
+ unloadable
+ end
+ end
+
+ module InstanceMethods
+ end
+ end
+end
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/lib/bibliography/user_author_patch.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/lib/bibliography/user_author_patch.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,45 @@
+require_dependency 'user'
+
+module Bibliography
+ module UserAuthorPatch
+ def self.included(base)
+ base.send(:include, InstanceMethods)
+ extend ClassMethods
+
+ end #self.included
+
+ module ClassMethods
+ end
+
+ module InstanceMethods
+
+ def institution
+ unless self.ssamr_user_detail.nil?
+ institution_name = self.ssamr_user_detail.institution_name
+ else
+ institution_name = "No Institution Set"
+ end
+ return institution_name
+ end
+
+ def get_author_info
+ # TODO: DELETE THIS METHOD??
+ info = {
+ :name_on_paper => self.name,
+ :email => self.mail,
+ :institution => "",
+ :author_user_id => self.id,
+ :is_user => "1"
+ }
+
+ if not self.ssamr_user_detail.nil?
+ info[:institution] = self.ssamr_user_detail.institution_name
+ end
+
+ return info
+ end
+
+ end #InstanceMethods
+
+ end #UserPublicationsPatch
+end #RedmineBibliography
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/lib/tasks/seed_bibtex_entry_types.rake
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/lib/tasks/seed_bibtex_entry_types.rake Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,20 @@
+namespace :redmine do
+ namespace :plugins do
+ namespace :redmine_bibliography do
+
+ task :seed_bibtex_entry_types => :environment do
+ desc "Seeds the Bibtex Entry Types Table"
+
+ quoted = ActiveRecord::Base.connection.quote_table_name('bibtex_entry_types')
+ ActiveRecord::Base.connection.execute("TRUNCATE #{quoted}")
+
+ open(File.dirname(__FILE__) + "/../../db/seed_data/bibtex_entry_types_list.txt") do |bibtex_entry_types|
+ bibtex_entry_types.read.each_line do |bibtex_entry_type|
+ BibtexEntryType.create(:name => bibtex_entry_type.chomp)
+ end
+ end
+ end
+
+ end
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/fixtures/authors.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/fixtures/authors.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,17 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+ id: 1
+ user_id:
+ name: MyString
+two:
+ id: 2
+ user_id:
+ name: MyString
+one:
+ id: 3
+ user_id:
+ name: MyString
+two:
+ id: 4
+ user_id:
+ name: MyString
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/fixtures/authorships.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/fixtures/authorships.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,33 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+ id: 1
+ author_id: 1
+ publication_id: 1
+ name_on_paper: Yih-Farn R. Chen
+ order: 1
+ institution:
+ email: MyString
+two:
+ id: 2
+ author_id: 2
+ publication_id: 1
+ name_on_paper: Glenn S. Fowler
+ order: 2
+ institution:
+ email: MyString
+three:
+ id: 3
+ author_id: 1
+ publication_id: 1
+ name_on_paper: Yih-Farn R. Chen
+ order: 1
+ institution:
+ email: MyString
+four:
+ id: 4
+ author_id: 2
+ publication_id: 1
+ name_on_paper: Glenn S. Fowler
+ order: 2
+ institution:
+ email: MyString
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/fixtures/bibtex_entries.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/fixtures/bibtex_entries.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,6 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+ id: 1
+ entry_type: InProceedings
+ booktitle: International Conference on Software Maintenance
+ year: 1995
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/fixtures/publications.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/fixtures/publications.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,9 @@
+# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
+one:
+ id: 1
+ title: Test Fixture Title No1
+ bibtex_entry_id: 1
+two:
+ id: 2
+ title: MyString
+ bibtex_entry_id: MyString
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/functional/authors_controller_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/functional/authors_controller_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,8 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class AuthorsControllerTest < ActionController::TestCase
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/functional/authorships_controller_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/functional/authorships_controller_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,8 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class AuthorshipsControllerTest < ActionController::TestCase
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/functional/publications_controller_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/functional/publications_controller_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,8 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class PublicationsControllerTest < ActionController::TestCase
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/test_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/test_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,24 @@
+# Load the normal Rails helper
+require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper')
+require 'publications_controller'
+
+# Ensure that we are using the temporary fixture path
+Engines::Testing.set_fixture_path
+
+class BibliographyControllerTest < ActionController::TestCase
+ fixtures :all
+
+ def setup
+ end
+
+ def test_publication
+
+ end
+
+
+ def test_routing
+ assert_routing(
+ {:method => :get, :path => '/requirements'},
+ :controller => 'requirements', :action => 'index'
+ )
+ end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/unit/author_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/unit/author_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class AuthorTest < ActiveSupport::TestCase
+ fixtures :authors
+
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/unit/authorship_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/unit/authorship_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class AuthorshipTest < ActiveSupport::TestCase
+ fixtures :authorships
+
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/unit/bibtex_entry_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/unit/bibtex_entry_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class BibtexEntryTest < ActiveSupport::TestCase
+ fixtures :bibtex_entries
+
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_bibliography/test/unit/publication_test.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_bibliography/test/unit/publication_test.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,10 @@
+require File.dirname(__FILE__) + '/../test_helper'
+
+class PublicationTest < ActiveSupport::TestCase
+ fixtures :publications
+
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/README.rdoc
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/README.rdoc Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,43 @@
+= Redmine Checkout plugin
+
+Author:: Holger Just
+URL:: http://dev.holgerjust.de/projects/redmine-checkout
+
+This plugin to Redmine adds a link to the actual repository to the GUI.
+
+This plugin includes ZeroClipboard[http://code.google.com/p/zeroclipboard/]
+by Joseph Huckaby. This software is licensed under the
+{GNU Lesser General Public License}[http://www.gnu.org/licenses/lgpl.html].
+
+Copyright (c) 2009, 2010 Holger Just
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+= Installation
+
+The installation follows the standard installation path from
+http://www.redmine.org/projects/redmine/wiki/Plugins
+
+1. Copy the software to the vendor/plugins directory. Make sure that the name
+ of the directory is redmine_checkout.
+2. Run rake db:migrate_plugins RAILS_ENV=production
+3. Restart Redmine
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/Rakefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/Rakefile Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,10 @@
+#!/usr/bin/env ruby
+require 'redmine_plugin_support'
+
+Dir[File.expand_path(File.dirname(__FILE__)) + "/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
+
+RedminePluginSupport::Base.setup do |plugin|
+ plugin.project_name = 'redmine_checkout'
+ plugin.default_task = [:spec]
+ plugin.tasks = [:doc, :release, :clean, :spec, :stats]
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/app/views/projects/settings/_repository_checkout.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/app/views/projects/settings/_repository_checkout.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,54 @@
+<%= form.select(:checkout_overwrite, [
+ [l(:general_text_Yes), "1"],
+ [l(:general_text_No), "0"]
+ ],
+ {},
+ :onchange => <<-EOF
+ Effect.toggle($('checkout_settings'), 'slide', {duration:0.2});
+ EOF
+ )%>
+
+>
+ <%=l :label_checkout %>
+
+ <%= form.text_area :checkout_description, :cols => 60, :rows => 5, :class => 'wiki-edit', :label => :field_description %>
+ <%= wikitoolbar_for 'repository_checkout_description' %>
+
+ <% if form.object.scm_name == 'Subversion' %>
+ <%= form.select :checkout_display_login,[
+ [l(:label_display_login_none), ''],
+ [l(:label_display_login_username), 'username'],
+ [l(:label_display_login_password), 'password']
+ ],
+ :label => :setting_checkout_display_login %>
+ <% end %>
+
+ <%= form.check_box :checkout_display_command %>
+
+ <% javascript_tag do %>
+ protocolForm = new Subform(
+ '<%= escape_javascript(render(:partial => "projects/settings/repository_checkout_protocol", :locals => {:protocol => Checkout::Protocol.new({:protocol => form.object.scm_name, :append_path => form.object.allow_subtree_checkout? ? 1: 0, :repository => form.object})})) %>',
+ <%= form.object.checkout_protocols.length %>,
+ 'checkout_protocol_table'
+ );
+ <% end %>
+ <%=l :label_protocol_plural %> <%=l :help_repository_checkout_protocols %>
+ <%= hidden_field_tag 'repository[checkout_protocols][-1][protocol]', 'empty' %>
+
+
+ <%= l(:setting_protocol)%>
+ <%= l(:setting_checkout_command)%>
+ <%= l(:setting_checkout_fixed_url) %>
+ <%= l(:label_permissions) %>
+ <%= l(:label_append_path) %>
+ <%= l(:label_default) %>
+
+
+
+ <% form.object.checkout_protocols.each_with_index do |protocol, index| %>
+ <%= render :partial => 'projects/settings/repository_checkout_protocol', :locals => {:protocol => protocol, :index => index, :classes => cycle('odd', 'even')} %>
+ <% end %>
+
+
+ <%= link_to_function l(:button_add_protocol), "protocolForm.add()", {:class => "icon icon-add"} %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/app/views/projects/settings/_repository_checkout_protocol.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/app/views/projects/settings/_repository_checkout_protocol.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,18 @@
+<%
+ index ||= "--INDEX--"
+ classes ||= ""
+
+ protocol = Checkout::Protocol.new(protocol) unless protocol.is_a? Checkout::Protocol
+%>
+" class="<%= classes %>" <%= 'style="display:none"' if index == '--INDEX--' %>>
+ <%= text_field_tag "repository[checkout_protocols][#{index}][protocol]", protocol.protocol, :size => 10 %>
+ <%= text_field_tag "repository[checkout_protocols][#{index}][command]", protocol.command, :size => 15 %>
+ <%= text_field_tag "repository[checkout_protocols][#{index}][fixed_url]", protocol.fixed_url, :size => 60 %>
+ <%= select_tag "repository[checkout_protocols][#{index}][access]", options_for_select([
+ [l(:label_access_read_write), 'read+write'],
+ [l(:label_access_read_only), 'read-only'],
+ [l(:label_access_permission), 'permission']], protocol.access) %>
+ <%= check_box_tag "repository[checkout_protocols][#{index}][append_path]", 1, protocol.append_path? %>
+ <%= check_box_tag "repository[checkout_protocols][#{index}][is_default]", 1, protocol.default? %>
+ <%= image_to_function 'delete.png', "var e=$('checkout_protocols_#{index}');var parent=e.up(\"tbody\");e.remove();recalculate_even_odd(parent);return false" %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/app/views/redmine_checkout_hooks/_view_repositories_show_contextual.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/app/views/redmine_checkout_hooks/_view_repositories_show_contextual.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,52 @@
+
+ <% if repository.checkout_description.present? %>
+
<%= textilizable repository.checkout_description %>
+ <% end %>
+ <% if protocols.present? %>
+
+
+ <%= text_field_tag :checkout_url, h(default_protocol.full_command(checkout_path)), :readonly => true %>
+ <%- if Setting.checkout_use_zero_clipboard? %>
+
+
<%= image_tag 'paste.png', :plugin => 'redmine_checkout' %>
+
+ <% end -%>
+
+
+ <% if User.current.logged? %>
+ <% if repository.is_external? %>
+ <%=l :label_access_type_all, :type => l(:label_access_read_only) %>
+ <% else %>
+ <% if default_protocol %><%=l :label_access_type, :type => l(default_protocol.access_label(User.current)) %><% end %>
+ <% end %>
+ <% else %>
+
+ <% end %>
+
+
+ <% javascript_tag do %>
+ var checkout_access = $H({<%= protocols.inject([]){|r,p| r << "'checkout_protocol_#{p.protocol.to_s.underscore}': '#{l(p.access_label(User.current))}'"}.join(', ') %>});
+ var checkout_commands = $H({<%= protocols.inject([]){|r,p| r << "'checkout_protocol_#{p.protocol.to_s.underscore}': '#{escape_javascript(p.full_command(checkout_path))}'"}.join(', ') %>});
+ <%- if Setting.checkout_use_zero_clipboard? %>ZeroClipboard.setMoviePath( '<%= image_path('ZeroClipboard.swf', :plugin => 'redmine_checkout') %>' );<% end %>
+ <% end %>
+
+ <% end%>
+ <% if repository.is_external? %>
+
+
+
<%= l(:text_repository_external, :location => repository.external_url) %>
+ <% end %>
+
+
+
+<% content_for :header_tags do %>
+ <%= stylesheet_link_tag 'checkout', :plugin => 'redmine_checkout' %>
+ <%= javascript_include_tag 'checkout', :plugin => 'redmine_checkout' %>
+ <%= (javascript_include_tag 'ZeroClipboard', :plugin => 'redmine_checkout') if Setting.checkout_use_zero_clipboard? %>
+<% end %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/app/views/settings/_checkout.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/app/views/settings/_checkout.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,43 @@
+<% form_tag({:action => 'edit', :tab => 'checkout'}) do %>
+
+<% javascript_tag do %>
+protocolForms = $H();
+
+document.observe("dom:loaded", function() {
+ $('tab-content-checkout').select('fieldset.collapsed').each(function(e){
+ e.down('div').hide();
+ });
+ <%
+ CheckoutHelper.supported_scm.select{|scm| Setting.enabled_scm.include?(scm)}.each do |scm|
+ next if Setting.send("checkout_overwrite_description_#{scm}?")
+ -%>
+ $('settings_checkout_description_<%= scm %>').up('div').up('div').hide();
+ <%- end %>
+});
+<% end %>
+
+
+
+
<%= setting_check_box :checkout_display_checkout_info %>
+
+
<%= setting_text_area :checkout_description_Abstract, :cols => 60, :rows => 5, :class => 'wiki-edit', :label => :field_description %>
+<%= wikitoolbar_for 'settings_checkout_description_Abstract' %>
+
+
<%= setting_check_box :checkout_use_zero_clipboard %>
+
+<% CheckoutHelper.supported_scm.select{|scm| Setting.enabled_scm.include?(scm)}.each do |scm| -%>
+
+ <%= "Repository::#{scm}".constantize.scm_name %>
+ <%= render :partial => 'checkout_scm', :locals => {:scm => scm} %>
+
+<%- end %>
+
+
+
+<%= submit_tag l(:button_save) %>
+<%- end %>
+
+<% content_for :header_tags do %>
+ <%= javascript_include_tag 'subform', :plugin => 'redmine_checkout' %>
+ <%= stylesheet_link_tag 'checkout', :plugin => 'redmine_checkout' %>
+<% end %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/app/views/settings/_checkout_protocol.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/app/views/settings/_checkout_protocol.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,19 @@
+<%
+ index ||= "--INDEX--"
+ classes ||= ""
+
+ protocol = Checkout::Protocol.new(protocol) unless protocol.is_a? Checkout::Protocol
+%>
+" class="<%= classes %>" <%= 'style="display:none"' if index == '--INDEX--' %>>
+ <%= text_field_tag "settings[checkout_protocols_#{scm}][#{index}][protocol]", protocol.protocol, :size => 10 %>
+ <%= text_field_tag "settings[checkout_protocols_#{scm}][#{index}][command]", protocol.command, :size => 15 %>
+ <%= text_field_tag "settings[checkout_protocols_#{scm}][#{index}][regex]", protocol.regex, :size => 30 %>
+ <%= text_field_tag "settings[checkout_protocols_#{scm}][#{index}][regex_replacement]", protocol.regex_replacement, :size => 30 %>
+ <%= select_tag "settings[checkout_protocols_#{scm}][#{index}][access]", options_for_select([
+ [l(:label_access_read_write), 'read+write'],
+ [l(:label_access_read_only), 'read-only'],
+ [l(:label_access_permission), 'permission']], protocol.access) %>
+ <%= check_box_tag "settings[checkout_protocols_#{scm}][#{index}][append_path]", 1, protocol.append_path? %>
+ <%= check_box_tag "settings[checkout_protocols_#{scm}][#{index}][is_default]", 1, protocol.default? %>
+ <%= image_to_function 'delete.png', "var e=$('checkout_protocols_#{scm}_#{index}');var parent=e.up(\"tbody\");e.remove();recalculate_even_odd(parent);return false" %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/app/views/settings/_checkout_scm.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/app/views/settings/_checkout_scm.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,46 @@
+
+
<%= setting_check_box "checkout_overwrite_description_#{scm}", :label => :setting_checkout_overwrite_description, :onclick => <<-EOF
+ Effect.toggle($('settings_checkout_description_#{scm}').up("div").up("div"), 'slide', {duration:0.2});
+ EOF
+ %>
+
+
+
<%= setting_text_area "checkout_description_#{scm}", :cols => 60, :rows => 5, :class => 'wiki-edit', :label => :field_description %>
+ <%= wikitoolbar_for "settings_checkout_description_#{scm}" %>
+
+
+ <% if scm == 'Subversion' %>
+
<%= setting_select "checkout_display_login",[
+ [l(:label_display_login_username), 'username'],
+ [l(:label_display_login_password), 'password']
+ ],
+ :blank => :label_display_login_none %>
+ <% end %>
+
+
<%= setting_check_box "checkout_display_command_#{scm}", :label => :field_checkout_display_command %>
+
+ <% javascript_tag do %>
+ <% repo = "Repository::#{scm}".constantize %>
+ var subform = new Subform('<%= escape_javascript(render(:partial => "checkout_protocol", :locals => {:protocol => Checkout::Protocol.new({:protocol => repo.scm_name, :append_path => (repo.allow_subtree_checkout? ? '1' : '0'), :command => repo.checkout_default_command}), :scm => scm})) %>',<%= Setting.send("checkout_protocols_#{scm}").length %>,'settings_checkout_protocols_<%= scm %>');
+ protocolForms.set('<%= scm %>', subform);
+ <% end %>
+
<%=l :label_protocol_plural %> <%=l :help_checkout_protocols %>
+
+
+ <%= l(:setting_protocol)%>
+ <%= l(:setting_checkout_command)%>
+ <%= l(:setting_checkout_url_regex) %>
+ <%= l(:setting_checkout_url_regex_replacement) %>
+ <%= l(:label_permissions) %>
+ <%= l(:label_append_path) %>
+ <%= l(:label_default) %>
+
+
+
+ <% Setting.send("checkout_protocols_#{scm}").each_with_index do |protocol, index| %>
+ <%= render :partial => 'checkout_protocol', :locals => {:protocol => Checkout::Protocol.new(protocol), :scm => scm, :index => index, :classes => cycle('odd', 'even')} %>
+ <% end %>
+
+
+
<%= link_to_function l(:button_add_protocol), "protocolForms.get('#{scm}').add()", {:class => "icon icon-add"} %>
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/app/views/settings/_redmine_checkout.html.erb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/app/views/settings/_redmine_checkout.html.erb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,1 @@
+<%=l(:help_moved_settings, :link => link_to(l(:label_settings_location), {:controller => 'settings', :action => 'index', :tab => 'checkout'})) %>
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/images/ZeroClipboard.as
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/images/ZeroClipboard.as Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,81 @@
+package {
+ // Simple Set Clipboard System
+ // Author: Joseph Huckaby
+
+ import flash.display.Stage;
+ import flash.display.Sprite;
+ import flash.display.LoaderInfo;
+ import flash.display.StageScaleMode;
+ import flash.events.*;
+ import flash.display.StageAlign;
+ import flash.display.StageScaleMode;
+ import flash.external.ExternalInterface;
+ import flash.system.Security;
+ import flash.utils.*;
+ import flash.system.System;
+
+ public class ZeroClipboard extends Sprite {
+
+ private var id:String = '';
+ private var button:Sprite;
+ private var clipText:String = '';
+
+ public function ZeroClipboard() {
+ // constructor, setup event listeners and external interfaces
+ stage.scaleMode = StageScaleMode.EXACT_FIT;
+ flash.system.Security.allowDomain("*");
+
+ // import flashvars
+ var flashvars:Object = LoaderInfo( this.root.loaderInfo ).parameters;
+ id = flashvars.id;
+
+ // invisible button covers entire stage
+ button = new Sprite();
+ button.buttonMode = true;
+ button.useHandCursor = true;
+ button.graphics.beginFill(0xCCFF00);
+ button.graphics.drawRect(0, 0, Math.floor(flashvars.width), Math.floor(flashvars.height));
+ button.alpha = 0.0;
+ addChild(button);
+ button.addEventListener(MouseEvent.CLICK, clickHandler);
+
+ button.addEventListener(MouseEvent.MOUSE_OVER, function(event:Event) {
+ ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'mouseOver', null );
+ } );
+ button.addEventListener(MouseEvent.MOUSE_OUT, function(event:Event) {
+ ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'mouseOut', null );
+ } );
+ button.addEventListener(MouseEvent.MOUSE_DOWN, function(event:Event) {
+ ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'mouseDown', null );
+ } );
+ button.addEventListener(MouseEvent.MOUSE_UP, function(event:Event) {
+ ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'mouseUp', null );
+ } );
+
+ // external functions
+ ExternalInterface.addCallback("setHandCursor", setHandCursor);
+ ExternalInterface.addCallback("setText", setText);
+
+ // signal to the browser that we are ready
+ ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'load', null );
+ }
+
+ public function setText(newText) {
+ // set the maximum number of files allowed
+ clipText = newText;
+ }
+
+ public function setHandCursor(enabled:Boolean) {
+ // control whether the hand cursor is shown on rollover (true)
+ // or the default arrow cursor (false)
+ button.useHandCursor = enabled;
+ }
+
+ private function clickHandler(event:Event):void {
+ // user click copies text to clipboard
+ // as of flash player 10, this MUST happen from an in-movie flash click event
+ System.setClipboard( clipText );
+ ExternalInterface.call( 'ZeroClipboard.dispatch', id, 'complete', clipText );
+ }
+ }
+}
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/images/ZeroClipboard.swf
Binary file vendor/plugins/redmine_checkout/assets/images/ZeroClipboard.swf has changed
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/images/button.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/images/button.svg Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/images/button_focus.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/images/button_focus.svg Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/images/button_selected.svg
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/images/button_selected.svg Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/images/paste.png
Binary file vendor/plugins/redmine_checkout/assets/images/paste.png has changed
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/javascripts/ZeroClipboard.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/javascripts/ZeroClipboard.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,311 @@
+// Simple Set Clipboard System
+// Author: Joseph Huckaby
+
+var ZeroClipboard = {
+
+ version: "1.0.7",
+ clients: {}, // registered upload clients on page, indexed by id
+ moviePath: 'ZeroClipboard.swf', // URL to movie
+ nextId: 1, // ID of next movie
+
+ $: function(thingy) {
+ // simple DOM lookup utility function
+ if (typeof(thingy) == 'string') thingy = document.getElementById(thingy);
+ if (!thingy.addClass) {
+ // extend element with a few useful methods
+ thingy.hide = function() { this.style.display = 'none'; };
+ thingy.show = function() { this.style.display = ''; };
+ thingy.addClass = function(name) { this.removeClass(name); this.className += ' ' + name; };
+ thingy.removeClass = function(name) {
+ var classes = this.className.split(/\s+/);
+ var idx = -1;
+ for (var k = 0; k < classes.length; k++) {
+ if (classes[k] == name) { idx = k; k = classes.length; }
+ }
+ if (idx > -1) {
+ classes.splice( idx, 1 );
+ this.className = classes.join(' ');
+ }
+ return this;
+ };
+ thingy.hasClass = function(name) {
+ return !!this.className.match( new RegExp("\\s*" + name + "\\s*") );
+ };
+ }
+ return thingy;
+ },
+
+ setMoviePath: function(path) {
+ // set path to ZeroClipboard.swf
+ this.moviePath = path;
+ },
+
+ dispatch: function(id, eventName, args) {
+ // receive event from flash movie, send to client
+ var client = this.clients[id];
+ if (client) {
+ client.receiveEvent(eventName, args);
+ }
+ },
+
+ register: function(id, client) {
+ // register new client to receive events
+ this.clients[id] = client;
+ },
+
+ getDOMObjectPosition: function(obj, stopObj) {
+ // get absolute coordinates for dom element
+ var info = {
+ left: 0,
+ top: 0,
+ width: obj.width ? obj.width : obj.offsetWidth,
+ height: obj.height ? obj.height : obj.offsetHeight
+ };
+
+ while (obj && (obj != stopObj)) {
+ info.left += obj.offsetLeft;
+ info.top += obj.offsetTop;
+ obj = obj.offsetParent;
+ }
+
+ return info;
+ },
+
+ Client: function(elem) {
+ // constructor for new simple upload client
+ this.handlers = {};
+
+ // unique ID
+ this.id = ZeroClipboard.nextId++;
+ this.movieId = 'ZeroClipboardMovie_' + this.id;
+
+ // register client with singleton to receive flash events
+ ZeroClipboard.register(this.id, this);
+
+ // create movie
+ if (elem) this.glue(elem);
+ }
+};
+
+ZeroClipboard.Client.prototype = {
+
+ id: 0, // unique ID for us
+ ready: false, // whether movie is ready to receive events or not
+ movie: null, // reference to movie object
+ clipText: '', // text to copy to clipboard
+ handCursorEnabled: true, // whether to show hand cursor, or default pointer cursor
+ cssEffects: true, // enable CSS mouse effects on dom container
+ handlers: null, // user event handlers
+
+ glue: function(elem, appendElem, stylesToAdd) {
+ // glue to DOM element
+ // elem can be ID or actual DOM element object
+ this.domElement = ZeroClipboard.$(elem);
+
+ // float just above object, or zIndex 99 if dom element isn't set
+ var zIndex = 99;
+ if (this.domElement.style.zIndex) {
+ zIndex = parseInt(this.domElement.style.zIndex, 10) + 1;
+ }
+
+ if (typeof(appendElem) == 'string') {
+ appendElem = ZeroClipboard.$(appendElem);
+ }
+ else if (typeof(appendElem) == 'undefined') {
+ appendElem = document.getElementsByTagName('body')[0];
+ }
+
+ // find X/Y position of domElement
+ var box = ZeroClipboard.getDOMObjectPosition(this.domElement, appendElem);
+
+ // create floating DIV above element
+ this.div = document.createElement('div');
+ var style = this.div.style;
+ style.position = 'absolute';
+ style.left = '' + box.left + 'px';
+ style.top = '' + box.top + 'px';
+ style.width = '' + box.width + 'px';
+ style.height = '' + box.height + 'px';
+ style.zIndex = zIndex;
+
+ if (typeof(stylesToAdd) == 'object') {
+ for (addedStyle in stylesToAdd) {
+ style[addedStyle] = stylesToAdd[addedStyle];
+ }
+ }
+
+ // style.backgroundColor = '#f00'; // debug
+
+ appendElem.appendChild(this.div);
+
+ this.div.innerHTML = this.getHTML( box.width, box.height );
+ },
+
+ getHTML: function(width, height) {
+ // return HTML for movie
+ var html = '';
+ var flashvars = 'id=' + this.id +
+ '&width=' + width +
+ '&height=' + height;
+
+ if (navigator.userAgent.match(/MSIE/)) {
+ // IE gets an OBJECT tag
+ var protocol = location.href.match(/^https/i) ? 'https://' : 'http://';
+ html += ' ';
+ }
+ else {
+ // all other browsers get an EMBED tag
+ html += ' ';
+ }
+ return html;
+ },
+
+ hide: function() {
+ // temporarily hide floater offscreen
+ if (this.div) {
+ this.div.style.left = '-2000px';
+ }
+ },
+
+ show: function() {
+ // show ourselves after a call to hide()
+ this.reposition();
+ },
+
+ destroy: function() {
+ // destroy control and floater
+ if (this.domElement && this.div) {
+ this.hide();
+ this.div.innerHTML = '';
+
+ var body = document.getElementsByTagName('body')[0];
+ try { body.removeChild( this.div ); } catch(e) {;}
+
+ this.domElement = null;
+ this.div = null;
+ }
+ },
+
+ reposition: function(elem) {
+ // reposition our floating div, optionally to new container
+ // warning: container CANNOT change size, only position
+ if (elem) {
+ this.domElement = ZeroClipboard.$(elem);
+ if (!this.domElement) this.hide();
+ }
+
+ if (this.domElement && this.div) {
+ var box = ZeroClipboard.getDOMObjectPosition(this.domElement);
+ var style = this.div.style;
+ style.left = '' + box.left + 'px';
+ style.top = '' + box.top + 'px';
+ }
+ },
+
+ setText: function(newText) {
+ // set text to be copied to clipboard
+ this.clipText = newText;
+ if (this.ready) this.movie.setText(newText);
+ },
+
+ addEventListener: function(eventName, func) {
+ // add user event listener for event
+ // event types: load, queueStart, fileStart, fileComplete, queueComplete, progress, error, cancel
+ eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+ if (!this.handlers[eventName]) this.handlers[eventName] = [];
+ this.handlers[eventName].push(func);
+ },
+
+ setHandCursor: function(enabled) {
+ // enable hand cursor (true), or default arrow cursor (false)
+ this.handCursorEnabled = enabled;
+ if (this.ready) this.movie.setHandCursor(enabled);
+ },
+
+ setCSSEffects: function(enabled) {
+ // enable or disable CSS effects on DOM container
+ this.cssEffects = !!enabled;
+ },
+
+ receiveEvent: function(eventName, args) {
+ // receive event from flash
+ eventName = eventName.toString().toLowerCase().replace(/^on/, '');
+
+ // special behavior for certain events
+ switch (eventName) {
+ case 'load':
+ // movie claims it is ready, but in IE this isn't always the case...
+ // bug fix: Cannot extend EMBED DOM elements in Firefox, must use traditional function
+ this.movie = document.getElementById(this.movieId);
+ if (!this.movie) {
+ var self = this;
+ setTimeout( function() { self.receiveEvent('load', null); }, 1 );
+ return;
+ }
+
+ // firefox on pc needs a "kick" in order to set these in certain cases
+ if (!this.ready && navigator.userAgent.match(/Firefox/) && navigator.userAgent.match(/Windows/)) {
+ var self = this;
+ setTimeout( function() { self.receiveEvent('load', null); }, 100 );
+ this.ready = true;
+ return;
+ }
+
+ this.ready = true;
+ this.movie.setText( this.clipText );
+ this.movie.setHandCursor( this.handCursorEnabled );
+ break;
+
+ case 'mouseover':
+ if (this.domElement && this.cssEffects) {
+ this.domElement.addClass('hover');
+ if (this.recoverActive) this.domElement.addClass('active');
+ }
+ break;
+
+ case 'mouseout':
+ if (this.domElement && this.cssEffects) {
+ this.recoverActive = false;
+ if (this.domElement.hasClass('active')) {
+ this.domElement.removeClass('active');
+ this.recoverActive = true;
+ }
+ this.domElement.removeClass('hover');
+ }
+ break;
+
+ case 'mousedown':
+ if (this.domElement && this.cssEffects) {
+ this.domElement.addClass('active');
+ }
+ break;
+
+ case 'mouseup':
+ if (this.domElement && this.cssEffects) {
+ this.domElement.removeClass('active');
+ this.recoverActive = false;
+ }
+ break;
+ } // switch eventName
+
+ if (this.handlers[eventName]) {
+ for (var idx = 0, len = this.handlers[eventName].length; idx < len; idx++) {
+ var func = this.handlers[eventName][idx];
+
+ if (typeof(func) == 'function') {
+ // actual function reference
+ func(this, args);
+ }
+ else if ((typeof(func) == 'object') && (func.length == 2)) {
+ // PHP style object + method, i.e. [myObject, 'myMethod']
+ func[0][ func[1] ](this, args);
+ }
+ else if (typeof(func) == 'string') {
+ // name of function
+ window[func](this, args);
+ }
+ } // foreach event handler defined
+ } // user defined handler for event
+ }
+
+};
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/javascripts/checkout.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/javascripts/checkout.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,33 @@
+document.observe("dom:loaded", function() {
+ /* update the checkout URL if clicked on a protocol */
+ $('checkout_protocols').select('a').each(function(e) {
+ e.observe('click', function(event) {
+ $('checkout_url').value = checkout_commands.get(this.id);
+ $('checkout_protocols').select('a').each(function(e) {
+ e.removeClassName("selected");
+ });
+ this.addClassName("selected")
+
+ var value = checkout_access.get(this.id);
+ $('checkout_access').innerHTML = value;
+
+ event.stop();
+ });
+ });
+ /* select the text field contents if activated */
+ Event.observe('checkout_url', 'click', function(event) {
+ this.activate();
+ });
+
+ if (typeof('ZeroClipboard') != 'undefined') {
+ $('clipboard_container').show();
+ clipboard = new ZeroClipboard.Client();
+ clipboard.setHandCursor( true );
+ clipboard.glue('clipboard_button', 'clipboard_container');
+
+ clipboard.addEventListener('mouseOver', function (client) {
+ clipboard.setText( $('checkout_url').value );
+ });
+ }
+});
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/javascripts/subform.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/javascripts/subform.js Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,45 @@
+var Subform = Class.create({
+ lineIndex: 1,
+ parentElement: "",
+ initialize: function(rawHTML, lineIndex, parentElement) {
+ this.rawHTML = rawHTML;
+ this.lineIndex = lineIndex;
+ this.parentElement = parentElement;
+ },
+
+ parsedHTML: function() {
+ return this.rawHTML.replace(/--INDEX--/g, this.lineIndex++);
+ },
+
+ add: function() {
+ var e = $(this.parentElement);
+ Element.insert(e, { bottom: this.parsedHTML()});
+ Effect.toggle(e.childElements().last(), 'slide', {duration:0.2});
+ recalculate_even_odd(e);
+ },
+
+ add_after: function(e) {
+ Element.insert(e, { after: this.parsedHTML()});
+ Effect.toggle(e.next(), 'slide', {duration:0.2});
+ recalculate_even_odd($(this.parentElement));
+ },
+
+ add_on_top: function() {
+ var e = $(this.parentElement);
+ Element.insert(e, { top: this.parsedHTML()});
+ Effect.toggle(e.childElements().first(), 'slide', {duration:0.2});
+ recalculate_even_odd(e);
+ }
+});
+
+function recalculate_even_odd(element) {
+ $A(element.childElements()).inject(
+ 0,
+ function(acc, e)
+ {
+ e.removeClassName("even");
+ e.removeClassName("odd");
+ e.addClassName( (acc%2==0) ? "odd" : "even"); return ++acc;
+ }
+ )
+}
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/stylesheets/checkout.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/stylesheets/checkout.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,166 @@
+/* Uncomment the following line for nicer tables if you use the alternate theme (or derived). */
+/* @import url(checkout_alternate.css); */
+
+table.checkout_protocol_table td { padding-right: 6px; vertical-align: middle; /* Double the border with of text input boxes */ }
+table.checkout_protocol_table td.protocol_access { padding-right: 0; }
+table.checkout_protocol_table td input[type=text], .checkout_protocol_table td select { width: 100%; }
+table.checkout_protocol_table td.protocol_delete { width: 16px; }
+table.checkout_protocol_table td.protocol_append_path, table.checkout_protocol_table td.protocol_is_default { text-align: center; }
+
+.icon-changeset { background-image: url(../../../images/changeset.png);}
+
+.repository-info {
+ background-color: #eee;
+ border: 1px solid #E4E4E4;
+ padding: 0 10px;
+ margin: 4px 0 10px;
+}
+
+.bottomline {
+ border-bottom: 1px solid #ccc;
+}
+
+.topline {
+ border-top: 1px solid #ccc;
+}
+
+#checkout_box {
+ margin: 10px 0;
+}
+
+#checkout_protocols {
+ height: 23px;
+ float: left;
+ margin: 0;
+ padding: 0;
+}
+
+#checkout_protocols li {
+ float: left;
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+}
+
+#checkout_protocols li:first-child a {
+ border-left-width: 1px;
+
+ /* Standard, Opera 10, IE 9 */
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+ /* Konquerer */
+ -khtml-border-top-left-radius: 3px;
+ -khtml-border-bottom-left-radius: 3px;
+ /* Gecko (Firefox, ...) */
+ -moz-border-radius: 3px 0 0 3px;
+ /* Webkit (Chrome, Safari, ...) */
+ -webkit-border-top-left-radius: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ /* IE <= 9 not supported */
+}
+
+#checkout_protocols li a,
+#clipboard_button {
+ background-color: #eee;
+ background: url(../images/button.svg) 0 0 no-repeat; /* Opera needs an "image" :( - using svg for this so it will scale properly without looking too ugly */
+ background: -khtml-gradient(linear, left top, left bottom, from(#f8f8f8), to(#ddd)); /* Konquerer */
+ background: -moz-linear-gradient(top, #f8f8f8, #ddd); /* Gecko (Firefox, ...) */
+ background: -webkit-gradient(linear, left top, left bottom, from(#f8f8f8), to(#ddd)); /* Webkit (Chrome, Safari, ...) */
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#dddddd'); /* IE 5.5 - 7 */
+ -ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f8f8f8', endColorstr='#dddddd'); /* IE 8 */
+
+ border-color: #bbb;
+ border-style: solid;
+ border-width: 1px 1px 1px 0;
+
+ color: #333;
+ display: block;
+ font-size: 11px;
+ font-weight: bold;
+ line-height: 21px;
+ margin: 0;
+ padding: 0 10px 0 11px;
+ text-decoration: none;
+ text-shadow: 1px 1px 0 #fff;
+ position: relative; /* to please IE */
+}
+
+#checkout_protocols li a:hover,
+#checkout_protocols li a:focus {
+ background-color: #507AAA;
+ background: url(../images/button_focus.svg) 0 0 no-repeat; /* Opera needs an "image" :( - using svg for this so it will scale properly without looking too ugly */
+ background: -khtml-gradient(linear, left top, left bottom, from(#759fcf), to(#507AAA)); /* Konquerer */
+ background: -moz-linear-gradient(top, #759fcf, #507AAA); /* Gecko (Firefox, ...) */
+ background: -webkit-gradient(linear, left top, left bottom, from(#759fcf), to(#507AAA)); /* Webkit (Chrome, Safari, ...) */
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#759fcf', endColorstr='#507AAA'); /* IE 5.5 - IE 7 */
+ -ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#759fcf', endColorstr='#507AAA'); /* IE 8 */
+
+ color: #fff;
+ text-shadow: -1px -1px 0 rgba(0,0,0,0.4);
+ border-top-color: #759fcf;
+ border-bottom-color: #507AAA;
+}
+
+#checkout_protocols li a.selected,
+#clipboard_button.active {
+ background-color: #bbb;
+ background: url(../images/button_selected.svg) 0 0 no-repeat; /* Opera needs an "image" :( - using svg for this so it will scale properly without looking too ugly */
+ background: -webkit-gradient(linear, left top, left bottom, from(#ccc), to(#aaa)); /* Konquerer */
+ background: -moz-linear-gradient(top, #ccc, #aaa); /* Gecko (Firefox, ...) */
+ background: -webkit-gradient(linear, left top, left bottom, from(#ccc), to(#aaa)); /* Webkit (Chrome, Safari, ...) */
+ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#aaaaaa'); /* IE 5.5 - IE 7 */
+ -ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cccccc', endColorstr='#aaaaaa'); /* IE 8 */
+
+ color: #000;
+ text-shadow: 1px 1px 0 rgba(255,255,255,0.4);
+ border-color: #bbb;
+}
+
+#checkout_url {
+ border: 1px solid #bbb;
+ border-width: 1px 1px 1px 0;
+ background-color: #fff;
+ color: #000;
+ font-size: 11px;
+ height: 16px;
+ padding: 3px 5px 2px;
+ width: 400px;
+ font-family: Monaco,"DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;
+ margin: 0 5px 0 0;
+ float: left;
+}
+
+#checkout_box p {
+ color: #666;
+ line-height: 23px;
+ font-size: 11px;
+ margin: 0 0 0 5px;
+}
+
+span#checkout_access {
+ font-weight: bold;
+}
+
+#clipboard_container {
+ position: relative;
+ float: left;
+ margin-right: 5px;
+}
+
+#clipboard_button {
+ height: 21px;
+ width: 23px;
+ padding: 0;
+ border-width: 1px;
+ text-align: center;
+
+ border-radius: 5px; /* Standard, Opera 10, IE 9 */
+ -khtml-border-radius: 3px; /* Konquerer */
+ -moz-border-radius: 3px ; /* Gecko (Firefox, ...) */
+ -webkit-border-radius: 3px; /* Webkit (Chrome, Safari, ...) */
+ /* IE <= 9 not supported */
+}
+
+#clipboard_button img {
+ padding-top: 2px;
+}
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/assets/stylesheets/checkout_alternate.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/assets/stylesheets/checkout_alternate.css Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,2 @@
+table.checkout_protocol_table td { padding-right: 10px !important; /* Double the border with of text input boxes */ }
+table.checkout_protocol_table td.protocol_access { padding-right: 2px !important; }
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/de.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/de.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,39 @@
+de:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Checkout-Informationen anzeigen"
+ setting_checkout_fixed_url: "Checkout-URL"
+ setting_checkout_url_regex: "Regulärer Ausdruck"
+ setting_checkout_url_regex_replacement: "Ersatztext"
+ setting_checkout_display_login: "Mitgliedsnamen anzeigen"
+ setting_checkout_command: "Checkout-Befehl"
+ setting_checkout_use_zero_clipboard: "Zwischenablagen-Helfer anzeigen"
+
+ setting_checkout_overwrite_description: "Standard-Beschreibung überschreiben"
+ field_checkout_overwrite: "Überschreibe Standardeinstellung für Checkout-Protokolle"
+ field_checkout_display_command: "Checkout-Befehl anzeigen"
+
+ label_protocol_plural: "Protokolle"
+ button_add_protocol: "Protokoll hinzufügen"
+
+ label_access_type: 'Diese URL erlaubt Zugriff zum {{type}} .'
+ label_access_read_only: 'Nur-Lesen'
+ label_access_read_write: "Lesen+Schreiben"
+ label_access_permission: "Abhängig von Benutzer-Rechten"
+
+ label_append_path: "Pfad anhängen"
+
+ label_display_login_none: "Mitgliedsnamen nicht anzeigen"
+ label_display_login_username: "Mitgliedsnamen anzeigen, aber kein Kennwort"
+ label_display_login_password: "Mitgliedsnamen und Kennwort anzeigen"
+
+ label_copy_to_clipboard: "In die Zwischenablage kopieren"
+
+ help_checkout_protocols: |
+ Die URLs in Protokollen werden aus der originalen URL erzeugt, auf die der
+ reguläre Ausdruck und der Ersatztext angewendet werden. Der Ersatztext
+ erlaubt Rückwärtsreferenzen zu geklammerten Audrücken mit der \1 Notation.
+ help_repository_checkout_protocols: |
+ Lassen Sie das Checkout-URL-Feld leer um die URL des Projektarchivs zu verwenden.
+ help_moved_settings: "Die Konfigurationsseite wurde nach {{link}} verschoben."
+ label_settings_location: "Administration -> Konfiguration -> Checkout"
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/en-GB.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/en-GB.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,41 @@
+en-GB:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Display checkout information"
+ setting_checkout_fixed_url: "Checkout URL"
+ setting_checkout_url_regex: "Regular expression"
+ setting_checkout_url_regex_replacement: "Replacement text"
+ setting_checkout_display_login: "Display Login"
+ setting_checkout_command: "Checkout command"
+ setting_checkout_use_zero_clipboard: "Display clipboard helper"
+
+ setting_checkout_overwrite_description: "Overwrite default description"
+ field_checkout_overwrite: "Overwrite default settings for checkout protocols"
+ field_checkout_display_command: "Display checkout command"
+
+ label_protocol_plural: "Protocols"
+ button_add_protocol: "Add Protocol"
+
+ label_access_type: 'You have {{type}} access to this URL.'
+ label_access_read_only: 'Read Only'
+ label_access_read_write: "Read and Write"
+ label_access_permission: "Depending on user's permissions"
+
+ label_append_path: "Append path"
+
+ label_display_login_none: "Do not show login or password"
+ label_display_login_username: "Show login but no password"
+ label_display_login_password: "Show login and password"
+
+ label_copy_to_clipboard: "Copy to clipboard"
+
+ help_checkout_protocols: |
+ The URLs in protocols are generated from applying the regular expression
+ and the replacement text to the original URL. The replacement text
+ supports back-references to braced expressions using the \1 notation.
+ help_repository_checkout_protocols: |
+ Leave the Checkout URL field empty to use the defined repository URL.
+ help_moved_settings: "The settings page has been moved to {{link}}."
+ label_settings_location: "Administration -> Settings -> Checkout"
+
+ text_repository_external: "The primary repository for this project is hosted at {{location}}
. This repository is a read-only copy which is updated automatically."
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/en.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/en.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,43 @@
+en:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Display checkout information"
+ setting_checkout_fixed_url: "Checkout URL"
+ setting_checkout_url_regex: "Regular expression"
+ setting_checkout_url_regex_replacement: "Replacement text"
+ setting_checkout_display_login: "Display Login"
+ setting_checkout_command: "Checkout command"
+ setting_checkout_use_zero_clipboard: "Display clipboard helper"
+
+ setting_checkout_overwrite_description: "Overwrite default description"
+ field_checkout_overwrite: "Overwrite default settings for checkout protocols"
+ field_checkout_display_command: "Display checkout command"
+
+ label_protocol_plural: "Protocols"
+ button_add_protocol: "Add Protocol"
+
+ label_access_type: 'You have {{type}} access to this URL.'
+ label_access_type_all: 'All access to this URL is {{type}} .'
+ label_access_read_only: 'Read Only'
+ label_access_read_write: "Read and Write"
+ label_access_permission: "Depending on user's permissions"
+
+ label_append_path: "Append path"
+
+ label_display_login_none: "Do not show login or password"
+ label_display_login_username: "Show login but no password"
+ label_display_login_password: "Show login and password"
+
+ label_copy_to_clipboard: "Copy to clipboard"
+
+ help_checkout_protocols: |
+ The URLs in protocols are generated from applying the regular expression
+ and the replacement text to the original URL. The replacement text
+ supports back-references to braced expressions using the \1 notation.
+ help_repository_checkout_protocols: |
+ Leave the Checkout URL field empty to use the defined repository URL.
+ help_moved_settings: "The settings page has been moved to {{link}}."
+ label_settings_location: "Administration -> Settings -> Checkout"
+
+ text_repository_external: "The primary repository for this project is hosted at {{location}}
. This repository is a read-only copy which is updated automatically every hour."
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/es.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/es.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,39 @@
+es:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Display checkout information"
+ setting_checkout_fixed_url: "URL de checkout"
+ setting_checkout_url_regex: "Expresion regular"
+ setting_checkout_url_regex_replacement: "Texto de remplazo"
+ setting_checkout_display_login: "Mostrar usuario"
+ setting_checkout_command: "Comando de checkout"
+ setting_checkout_use_zero_clipboard: "Display clipboard helper"
+
+ setting_checkout_overwrite_description: "Overwrite default description"
+ field_checkout_overwrite: "Overwrite default settings for checkout protocols"
+ field_checkout_display_command: "Display checkout command"
+
+ label_protocol_plural: "Protocolos"
+ button_add_protocol: "Crear Protocolo"
+
+ label_access_type: 'This URL has {{type}} access.'
+ label_access_read_only: 'Read-Only'
+ label_access_read_write: "Read+Write"
+ label_access_permission: "Depending on user's permissions"
+
+ label_append_path: "Append path"
+
+ label_display_login_none: "No mostrar usuario o contraseña"
+ label_display_login_username: "Mostrar usuario pero no contraseña"
+ label_display_login_password: "Mostrar usuario y contraseña"
+
+ label_copy_to_clipboard: "Copy to clipboard"
+
+ help_checkout_protocols: |
+ The URLs in protocols are generated from applying the regular expression
+ and the replacement text to the original URL. The replacement text
+ supports back-references to braced expressions using the \1 notation.
+ help_repository_checkout_protocols: |
+ Leave the Checkout URL field empty to use the defined repository URL.
+ help_moved_settings: "The settings page has been moved to {{link}}."
+ label_settings_location: "Administration -> Settings -> Checkout"
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/fr.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/fr.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,39 @@
+fr:
+ label_checkout: "Dépôt"
+
+ setting_checkout_display_checkout_info: "Display checkout information"
+ setting_checkout_fixed_url: "URL du dépôt"
+ setting_checkout_url_regex: "Expression Régulière"
+ setting_checkout_url_regex_replacement: "Texte de substitution"
+ setting_checkout_display_login: "Affiche le login"
+ setting_checkout_command: "Checkout command"
+ setting_checkout_use_zero_clipboard: "Display clipboard helper"
+
+ setting_checkout_overwrite_description: "Overwrite default description"
+ field_checkout_overwrite: "Overwrite default settings for checkout protocols"
+ field_checkout_display_command: "Affiche l'URL du dépôt"
+
+ label_protocol_plural: "Protocoles"
+ button_add_protocol: "Créer un protocole"
+
+ label_access_type: 'This URL has {{type}} access.'
+ label_access_read_only: 'Read-Only'
+ label_access_read_write: "Read+Write"
+ label_access_permission: "Depending on user's permissions"
+
+ label_append_path: "Append path"
+
+ label_display_login_none: "Ne pas afficher le login ni le mot de passe"
+ label_display_login_username: "Afficher le login, pas le mot de passe"
+ label_display_login_password: "Afficher le login et le mot de passe"
+
+ label_copy_to_clipboard: "Copy to clipboard"
+
+ help_checkout_protocols: |
+ The URLs in protocols are generated from applying the regular expression
+ and the replacement text to the original URL. The replacement text
+ supports back-references to braced expressions using the \1 notation.
+ help_repository_checkout_protocols: |
+ Leave the Checkout URL field empty to use the defined repository URL.
+ help_moved_settings: "The settings page has been moved to {{link}}."
+ label_settings_location: "Administration -> Settings -> Checkout"
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/it.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/it.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,40 @@
+it:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Visualizza le informazioni sul checkout"
+ setting_checkout_fixed_url: "URL di checkout"
+ setting_checkout_url_regex: "Espressione regolare"
+ setting_checkout_url_regex_replacement: "Testo sostituito"
+ setting_checkout_display_login: "Login visualizzato"
+ setting_checkout_command: "Comando per il checkout"
+ setting_checkout_use_zero_clipboard: "Visualizza l'utility per la copia negli appunti"
+
+ setting_checkout_overwrite_description: "Sovrascrivi la descrizione predefinita"
+ field_checkout_overwrite: "Sovrascrivi le impostazioni di checkout predefinite"
+ field_checkout_display_command: "Visualizza il comando per il checkout"
+
+ label_protocol_plural: "Protocolli"
+ button_add_protocol: "Aggiungi Protocollo"
+
+ label_access_type: 'Questo URL ha accesso {{type}} .'
+ label_access_read_only: 'Sola-Lettura'
+ label_access_read_write: "Lettura+Scrittura"
+ label_access_permission: "Dipende dai permessi dell'utente"
+
+ label_append_path: "Aggiungi percorso"
+
+ label_display_login_none: "Non mostrare il login e password"
+ label_display_login_username: "Mostra il login senza password"
+ label_display_login_password: "Mostra il login e la password"
+
+ label_copy_to_clipboard: "Copia negli appunti"
+
+ help_checkout_protocols: |
+ Gli URL dei protocolli sono generati applicando le espressioni regolari
+ ed effettuando la sostituzione dell'URL originale con il testo specificato.
+ Il testo per la sostituzione può contenere riferimenti a più match usando
+ la notazione \1 \2...
+ help_repository_checkout_protocols: |
+ Lascia il campo URL di checkout bianco per usare l'URL definito nel repository.
+ help_moved_settings: "La pagina delle impostazioni è stata spostata in {{link}}."
+ label_settings_location: "Amministrazione -> Impostazioni -> Checkout"
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/ja.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/ja.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,39 @@
+ja:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Display checkout information"
+ setting_checkout_fixed_url: "チェックアウト URL"
+ setting_checkout_url_regex: "Regular expression"
+ setting_checkout_url_regex_replacement: "Replacement text"
+ setting_checkout_display_login: "ログインの表示"
+ setting_checkout_command: "Checkout command"
+ setting_checkout_use_zero_clipboard: "Display clipboard helper"
+
+ setting_checkout_overwrite_description: "Overwrite default description"
+ field_checkout_overwrite: "Overwrite default settings for checkout protocols"
+ field_checkout_display_command: "Display checkout command"
+
+ label_protocol_plural: "Protocols"
+ button_add_protocol: "Add Protocol"
+
+ label_access_type: 'This URL has {{type}} access.'
+ label_access_read_only: 'Read-Only'
+ label_access_read_write: "Read+Write"
+ label_access_permission: "Depending on user's permissions"
+
+ label_append_path: "Append path"
+
+ label_display_login_none: "ログインとパスワードを非表示"
+ label_display_login_username: "ログインのみ表示"
+ label_display_login_password: "ログインとパスワードを表示"
+
+ label_copy_to_clipboard: "Copy to clipboard"
+
+ help_checkout_protocols: |
+ The URLs in protocols are generated from applying the regular expression
+ and the replacement text to the original URL. The replacement text
+ supports back-references to braced expressions using the \1 notation.
+ help_repository_checkout_protocols: |
+ Leave the Checkout URL field empty to use the defined repository URL.
+ help_moved_settings: "The settings page has been moved to {{link}}."
+ label_settings_location: "Administration -> Settings -> Checkout"
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/ko.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/ko.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,40 @@
+ko:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Display checkout information"
+ setting_checkout_fixed_url: "체크 아웃 URL"
+ setting_checkout_url_regex: "정규식"
+ setting_checkout_url_regex_replacement: "대체 문자열"
+ setting_checkout_display_login: "로그인 표시"
+ setting_checkout_command: "Checkout command"
+ setting_checkout_use_zero_clipboard: "Display clipboard helper"
+
+ setting_checkout_overwrite_description: "Overwrite default description"
+ field_checkout_overwrite: "Overwrite default settings for checkout protocols"
+ field_checkout_display_command: "Display checkout command"
+
+ label_protocol_plural: "Protocols"
+ button_add_protocol: "Add Protocol"
+
+ label_access_type: 'This URL has {{type}} access.'
+ label_access_read_only: 'Read-Only'
+ label_access_read_write: "Read+Write"
+ label_access_permission: "Depending on user's permissions"
+
+ label_append_path: "Append path"
+
+ label_display_login_none: "로그인과 비밀번호를 보여주지 않습니다."
+ label_display_login_username: "로그인은 보여주지만 비밀번호는 보여주지 않습니다."
+ label_display_login_password: "로그인과 비밀번호를 보여줍니다."
+
+ label_copy_to_clipboard: "Copy to clipboard"
+
+ help_checkout_protocols: |
+ The URLs in protocols are generated from applying the regular expression
+ and the replacement text to the original URL. The replacement text
+ supports back-references to braced expressions using the \1 notation.
+ help_repository_checkout_protocols: |
+ Leave the Checkout URL field empty to use the defined repository URL.
+ help_moved_settings: "The settings page has been moved to {{link}}."
+ label_settings_location: "Administration -> Settings -> Checkout"
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/nl.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/nl.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,40 @@
+nl:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Checkout-informatie tonen"
+ setting_checkout_fixed_url: "Checkout-URL"
+ setting_checkout_url_regex: "Reguliere expressie"
+ setting_checkout_url_regex_replacement: "Vervangingstekst"
+ setting_checkout_display_login: "Geef login weer"
+ setting_checkout_command: "Checkout-opdracht"
+ setting_checkout_use_zero_clipboard: "Klembord-hulp tonen"
+
+ setting_checkout_overwrite_description: "Standaard omschrijving overschrijven"
+ field_checkout_overwrite: "Overschrijf standaard instellingen voor checkout-protocollen"
+ field_checkout_display_command: "Checkout-opdracht tonen"
+
+ label_protocol_plural: "Protocollen"
+ button_add_protocol: "Protocol toevoegen"
+
+ label_access_type: 'Deze URL heeft {{type}} toegang.'
+ label_access_read_only: 'Alleen lezen'
+ label_access_read_write: "Lezen en schrijven"
+ label_access_permission: "Afhankelijk van gebruikersrechten"
+
+ label_append_path: "Pad toevoegen"
+
+ label_display_login_none: "Geen logingegevens tonen"
+ label_display_login_username: "Toon login zonder wachtwoord"
+ label_display_login_password: "Toon login en wachtwoord"
+
+ label_copy_to_clipboard: "Naar klembord kopiëren"
+
+ help_checkout_protocols: |
+ De URLs in protocollen worden samengesteld vanuit de originele URL, na
+ toepassing van de reguliere expressie en vervangingstekst. De vervangingstekst
+ ondersteunt referenties vanuit tussen haakjes geplaatste expressies
+ door middel van de \1 notatie.
+ help_repository_checkout_protocols: |
+ Laat het veld Checkout-URL leeg om de projectrepository te gebruiken.
+ help_moved_settings: "De instellingspagina is verplaatst naar {{link}}."
+ label_settings_location: "Administratie -> Instellingen -> Checkout"
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/pl.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/pl.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,39 @@
+pl:
+ label_checkout: "Pobieranie repozytorium"
+
+ setting_checkout_display_checkout_info: "Pokaż informację o możliwości pobrania repozytorium"
+ setting_checkout_fixed_url: "Adres URL pobierania repozytorium"
+ setting_checkout_url_regex: "Wyrażenie regularne"
+ setting_checkout_url_regex_replacement: "Wynikowy adres URL"
+ setting_checkout_display_login: "Pokaż dane logowania"
+ setting_checkout_command: "Komenda pobrania repozytorium"
+ setting_checkout_use_zero_clipboard: "Pokaż pomocnika schowka"
+
+ setting_checkout_overwrite_description: "Nadpisz domyślny opis"
+ field_checkout_overwrite: "Nadpisz domyślne ustawienia dla protokołów"
+ field_checkout_display_command: "Pokaż komendę pobrania repozytorium"
+
+ label_protocol_plural: "Protokoły"
+ button_add_protocol: "Dodaj protokół"
+
+ label_access_type: 'Ten adres URL ma dostęp {{type}} .'
+ label_access_read_only: 'Tylko do odczytu'
+ label_access_read_write: "Odczyt+Zapis"
+ label_access_permission: "Zależne od uprawnień użytkownika"
+
+ label_append_path: "Dołącz ścieżkę"
+
+ label_display_login_none: "Nie pokazuj loginu ani hasła"
+ label_display_login_username: "Pokaż tylko login"
+ label_display_login_password: "Pokaż login i hasło"
+
+ label_copy_to_clipboard: "Kopiuj do schowka"
+
+ help_checkout_protocols: |
+ Wynikowe adresy URL w protokołach są generowane przez zamianę oryginalnego
+ adresu URL repozytorium na podstawie wyrażenia regularnego. Wynikowy adres
+ URL wspiera referencje do grup (tzw. back-references) używając notacji \1.
+ help_repository_checkout_protocols: |
+ Pozostaw adres URL pobierania repozytorium pusty aby uzyć adresu zdefiniowanego w ustawieniach projektu.
+ help_moved_settings: "Ustawienia zostały przeniesione do {{link}}."
+ label_settings_location: "Administracja -> Ustawienia -> Pobieranie repozytorium"
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/config/locales/ro.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/config/locales/ro.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,39 @@
+ro:
+ label_checkout: "Checkout"
+
+ setting_checkout_display_checkout_info: "Display checkout information"
+ setting_checkout_fixed_url: "URL-ul pentru checkout"
+ setting_checkout_url_regex: "Expresie regulata (regexp)"
+ setting_checkout_url_regex_replacement: "Text inlocuitor (regexp)"
+ setting_checkout_display_login: "Arata datele pentru autentificare"
+ setting_checkout_command: "Comanda de checkout"
+ setting_checkout_use_zero_clipboard: "Display clipboard helper"
+
+ setting_checkout_overwrite_description: "Overwrite default description"
+ field_checkout_overwrite: "Overwrite default settings for checkout protocols"
+ field_checkout_display_command: "Display checkout command"
+
+ label_protocol_plural: "Protocols"
+ button_add_protocol: "Add Protocol"
+
+ label_access_type: 'This URL has {{type}} access.'
+ label_access_read_only: 'Read-Only'
+ label_access_read_write: "Read+Write"
+ label_access_permission: "Depending on user's permissions"
+
+ label_append_path: "Append path"
+
+ label_display_login_none: "Nu afisa username sau parola"
+ label_display_login_username: "Afiseaza username-ul, dar nu si parola"
+ label_display_login_password: "Afiseaza atat username-ul, cat si parola"
+
+ label_copy_to_clipboard: "Copy to clipboard"
+
+ help_checkout_protocols: |
+ The URLs in protocols are generated from applying the regular expression
+ and the replacement text to the original URL. The replacement text
+ supports back-references to braced expressions using the \1 notation.
+ help_repository_checkout_protocols: |
+ Leave the Checkout URL field empty to use the defined repository URL.
+ help_moved_settings: "The settings page has been moved to {{link}}."
+ label_settings_location: "Administration -> Settings -> Checkout"
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20091208210439_add_checkout_url_info.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20091208210439_add_checkout_url_info.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,11 @@
+class AddCheckoutUrlInfo < ActiveRecord::Migration
+ def self.up
+ add_column :repositories, :checkout_url_type, :string, :default => 'none', :null => false
+ add_column :repositories, :checkout_url, :string, :default => '', :null => false
+ end
+
+ def self.down
+ remove_column :repository, :checkout_url_type
+ remove_column :repository, :checkout_url
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20091220173312_add_display_login.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20091220173312_add_display_login.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,9 @@
+class AddDisplayLogin < ActiveRecord::Migration
+ def self.up
+ add_column :repositories, :display_login, :string, :default => 'none', :null => false
+ end
+
+ def self.down
+ remove_column :repositories, :display_login
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20100118174556_add_render_link.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100118174556_add_render_link.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,9 @@
+class AddRenderLink < ActiveRecord::Migration
+ def self.up
+ add_column :repositories, :render_link, :boolean, :null => true
+ end
+
+ def self.down
+ remove_column :repositories, :render_link
+ end
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20100118235845_remove_defaults.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100118235845_remove_defaults.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,14 @@
+class RemoveDefaults < ActiveRecord::Migration
+ def self.up
+ change_column :repositories, :checkout_url_type, :string, :default => nil, :null => true
+ change_column :repositories, :checkout_url, :string, :default => nil, :null => true
+ change_column :repositories, :display_login, :string, :default => nil, :null => true
+ end
+
+ def self.down
+ change_column :repositories, :checkout_url_type, :string, :default => 'none', :null => false
+ change_column :repositories, :checkout_url, :string, :default => '', :null => false
+ change_column :repositories, :display_login, :string, :default => 'none', :null => false
+ end
+end
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20100118235909_add_overwrite_option.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100118235909_add_overwrite_option.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,15 @@
+class AddOverwriteOption < ActiveRecord::Migration
+ def self.up
+ add_column :repositories, :checkout_url_overwrite, :boolean, :default => false, :null => false
+
+ # existing repositories are set to overwrite the default settings
+ # This is to keep continuity of settings.
+ Repository.reset_column_information
+ Repository.update_all({:checkout_url_overwrite, true})
+ end
+
+ def self.down
+ remove_column :repositories, :checkout_url_overwrite
+ end
+end
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20100203202320_update_settings.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100203202320_update_settings.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,36 @@
+class UpdateSettings < ActiveRecord::Migration
+ def self.up
+ settings = Setting.plugin_redmine_checkout
+ if settings['checkout_url_type'] == "overwritten"
+ settings['checkout_url_type'] = "generated"
+ end
+
+ if settings.has_key? "checkout_url_regex"
+ settings['checkout_url_regex_default'] = settings.delete("checkout_url_regex")
+ end
+
+ if settings.has_key? "checkout_url_regex_replacement"
+ settings['checkout_url_regex_replacement_default'] = settings.delete("checkout_url_regex_replacement")
+ end
+
+ Setting.plugin_redmine_checkout = settings
+ end
+
+ def self.down
+ settings = Setting.plugin_redmine_checkout
+ if settings['checkout_url_type'] == "generated"
+ settings['checkout_url_type'] = "overwritten"
+ end
+
+ if settings.has_key? "checkout_url_regex_default"
+ settings['checkout_url_regex'] = settings.delete("checkout_url_regex_default")
+ end
+
+ if settings.has_key? "checkout_url_regex_replacement_default"
+ settings['checkout_url_regex_replacement'] = settings.delete("checkout_url_regex_replacement_default")
+ end
+
+ Setting.plugin_redmine_checkout = settings
+ end
+end
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20100426154202_rename_render_link_to_render_type.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100426154202_rename_render_link_to_render_type.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,31 @@
+class RenameRenderLinkToRenderType < ActiveRecord::Migration
+ def self.up
+ render_link = Setting.plugin_redmine_checkout.delete 'render_link'
+ unless render_link.nil?
+ Setting.plugin_redmine_checkout['render_type'] = (render_link == 'true' ? 'link' : 'url')
+ Setting.plugin_redmine_checkout = Setting.plugin_redmine_checkout
+ end
+
+ add_column :repositories, :render_type, :string, :default => 'url', :null => false
+
+ Repository.update_all({:render_type => 'link'}, :render_link => true)
+ Repository.update_all({:render_type => 'url'}, ["render_link != ?", true])
+
+ remove_column :repositories, :render_link
+ end
+
+ def self.down
+ render_type = Setting.plugin_redmine_checkout.delete 'render_type'
+ unless render_type.nil?
+ Setting.plugin_redmine_checkout['render_link'] = (render_type == 'link' ? 'true' : 'false')
+ Setting.plugin_redmine_checkout = Setting.plugin_redmine_checkout
+ end
+
+ add_column :repositories, :render_link, :boolean, :null => true
+
+ Repository.update_all({:render_link => true}, :render_type => 'link')
+ Repository.update_all({:render_link => false}, ["render_type != ?", 'link'])
+
+ remove_column :repositories, :render_type
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20100512135418_consolidate_repository_options.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100512135418_consolidate_repository_options.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,49 @@
+class ConsolidateRepositoryOptions < ActiveRecord::Migration
+ class Repository < ActiveRecord::Base
+ def self.inheritance_column
+ # disable single table inheritance
+ nil
+ end
+
+ serialize :checkout_settings, Hash
+ end
+
+ def self.up
+ add_column :repositories, :checkout_settings, :text
+
+ Repository.all.each do |r|
+ r.checkout_settings = {
+ "checkout_url_type" => r.checkout_url_type,
+ "checkout_url" => r.checkout_url,
+ "display_login" => r.display_login,
+ "render_type" => r.render_type,
+ "checkout_url_overwrite" => r.checkout_url_overwrite
+ }
+ r.save!
+ end
+ remove_column :repositories, :checkout_url_type
+ remove_column :repositories, :checkout_url
+ remove_column :repositories, :display_login
+ remove_column :repositories, :render_type
+ remove_column :repositories, :checkout_url_overwrite
+ end
+
+ def self.down
+ add_column :repositories, :checkout_url_type, :string, :default => nil, :null => true
+ add_column :repositories, :checkout_url, :string, :default => nil, :null => true
+ add_column :repositories, :display_login, :string, :default => nil, :null => true
+ add_column :repositories, :render_type, :string, :default => 'url', :null => false
+ add_column :repositories, :checkout_url_overwrite, :boolean, :default => false, :null => false
+
+ Repository.all.each do |r|
+ r.checkout_url_type = r.checkout_settings["checkout_url_type"]
+ r.checkout_url = r.checkout_settings["checkout_url"]
+ r.display_login = r.checkout_settings["display_login"]
+ r.render_link = r.checkout_settings["render_link"]
+ r.checkout_url_overwrite = r.checkout_settings["checkout_url_overwrite"]
+ r.save!
+ end
+
+ remove_column :repositories, :checkout_settings
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20100609153630_apply_setting_changes.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100609153630_apply_setting_changes.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,113 @@
+class ApplySettingChanges < ActiveRecord::Migration
+ class Repository < ActiveRecord::Base
+ def self.inheritance_column
+ # disable single table inheritance
+ nil
+ end
+
+ def scm_name
+ self.type || 'Abstract'
+ end
+
+ serialize :checkout_settings, Hash
+ end
+
+ def self.up
+ default_commands = {
+ 'Bazaar' => 'bzr checkout',
+ 'Cvs' => 'cvs checkout',
+ 'Darcs' => 'darcs get',
+ 'Git' => 'git clone',
+ 'Mercurial' => 'hg clone',
+ 'Subversion' => 'svn checkout'
+ }
+
+ ## First migrate the individual repositories
+
+ Repository.all.each do |r|
+ allow_subtree_checkout = ['Cvs', 'Subversion'].include? r.scm_name
+
+ protocol = case r.checkout_settings['checkout_url_type']
+ when 'none', 'generated'
+ nil
+ when 'original', 'overwritten'
+ HashWithIndifferentAccess.new({ "0" => HashWithIndifferentAccess.new({
+ :protocol => r.scm_name,
+ :command => Setting.plugin_redmine_checkout["checkout_cmd_#{r.scm_name}"] || default_commands[r.scm_name],
+ :regex => "",
+ :regex_replacement => "",
+ :fixed_url => (r.checkout_settings['checkout_url_type'] == 'original' ? (r.url || "") : r.checkout_settings["checkout_url"]),
+ :access => 'permission',
+ :append_path => (allow_subtree_checkout ? '1' : '0'),
+ :is_default => '1'})
+ })
+ end
+
+ r.checkout_settings = Hash.new({
+ 'checkout_protocols' => protocol,
+ 'checkout_description' => "The data contained in this repository can be downloaded to your computer using one of several clients.
+Please see the documentation of your version control software client for more information.
+
+Please select the desired protocol below to get the URL.",
+ 'checkout_display_login' => (r.checkout_settings['display_login'] == 'none' ? '' : r.checkout_settings['display_login']),
+ 'checkout_overwrite' => (r.checkout_settings['checkout_url_overwrite'] == 'true') ? '1': '0',
+ 'checkout_display_command' => (r.checkout_settings["render_type"].to_s == 'cmd') ? '1' : '0'
+ })
+ r.save!
+ end
+
+ ## Then the global settings
+
+ settings = HashWithIndifferentAccess.new({
+ 'display_login' => Setting.plugin_redmine_checkout['display_login'],
+ 'use_zero_clipboard' => '1',
+
+ 'display_checkout_info' => (Setting.plugin_redmine_checkout['checkout_url_type'] == 'none' ? '0' : '1'),
+ 'description_Abstract' => <<-EOF
+The data contained in this repository can be downloaded to your computer using one of several clients.
+Please see the documentation of your version control software client for more information.
+
+Please select the desired protocol below to get the URL.
+EOF
+ })
+
+ default_commands.keys.each do |scm|
+ settings["description_#{scm}"] = ''
+ settings["overwrite_description_#{scm}"] = '0'
+
+ display_command = (Setting.plugin_redmine_checkout["render_type"].to_s == 'cmd') ? '1' : '0'
+ settings["display_command_#{scm}"] = display_command
+
+ case Setting.plugin_redmine_checkout['checkout_url_type']
+ when 'generated', 'none':
+ regex = Setting.plugin_redmine_checkout["checkout_url_regex_#{scm}"]
+ replacement = Setting.plugin_redmine_checkout["checkout_url_regex_replacement_#{scm}"]
+ when 'original':
+ regex = ''
+ replacement = ''
+ end
+
+ settings["protocols_#{scm}"] = HashWithIndifferentAccess.new({
+ # access can be one of
+ # read+write => this protocol always allows read/write access
+ # read-only => this protocol always allows read access only
+ # permission => Access depends on redmine permissions
+ '0' => HashWithIndifferentAccess.new({
+ :protocol => scm,
+ :command => Setting.plugin_redmine_checkout["checkout_cmd_#{scm}"] || default_commands[scm],
+ :regex => regex,
+ :regex_replacement => replacement,
+ :fixed_url => '',
+ :access => 'permission',
+ :append_path => (['Cvs', 'Subversion'].include?(scm) ? '1' : '0'),
+ :is_default => '1'
+ })
+ })
+ end
+ Setting.plugin_redmine_checkout = settings
+ end
+
+ def self.down
+ raise ActiveRecord::IrreversibleMigration.new "Sorry, there is no down migration yet. If you really need one, please create an issue on http://dev.holgerjust.de/projects/redmine-checkout"
+ end
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/db/migrate/20100808185600_change_protocol_storage_from_hash_to_array.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/db/migrate/20100808185600_change_protocol_storage_from_hash_to_array.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,58 @@
+class ChangeProtocolStorageFromHashToArray < ActiveRecord::Migration
+ class Repository < ActiveRecord::Base
+ def self.inheritance_column
+ # disable single table inheritance
+ nil
+ end
+
+ def scm_name
+ self.type || 'Abstract'
+ end
+
+ serialize :checkout_settings, Hash
+ end
+
+ def self.up
+ ## First migrate the individual repositories
+ Repository.all.each do |r|
+ next unless r.checkout_settings
+ next unless r.checkout_settings['checkout_protocols'].is_a? Hash
+ r.checkout_settings['checkout_protocols'] = r.checkout_settings['checkout_protocols'].sort{|(ak,av),(bk,bv)|ak<=>bk}.collect{|id,protocol| protocol}
+ r.save!
+ end
+
+ ## Then the global settings
+ settings = Setting.plugin_redmine_checkout
+ settings.keys.grep(/^protocols_/).each do |protocols|
+ next unless settings[protocols].is_a? Hash
+ settings[protocols] = settings[protocols].sort{|(ak,av),(bk,bv)|ak<=>bk}.collect{|id,protocol| protocol}
+ end
+ Setting.plugin_redmine_checkout = settings
+ end
+
+ def self.down
+ ## First migrate the individual repositories
+ Repository.all.each do |r|
+ next unless r.checkout_settings['checkout_protocols'].is_a? Hash
+ r.checkout_settings['checkout_protocols'] = r.checkout_settings['checkout_protocols'].inject(HashWithIndifferentAccess.new) do |result, p|
+ result[result.length.to_s] = p
+ end
+ r.save!
+ end
+
+ ## Then the global settings
+ settings = Setting.plugin_redmine_checkout
+ settings.keys.grep(/^protocols_/).each do |protocols|
+ next unless r.checkout_settings['checkout_protocols'].is_a? Hash
+ settings[protocols] = settings[protocols].inject(HashWithIndifferentAccess.new) do |result, p|
+ result[result.length.to_s] = p
+ end
+ end
+ Setting.plugin_redmine_checkout = settings
+
+
+
+
+ raise ActiveRecord::IrreversibleMigration.new "Sorry, there is no down migration yet. If you really need one, please create an issue on http://dev.holgerjust.de/projects/redmine-checkout"
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/doc/COPYING
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/doc/COPYING Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,22 @@
+Copyright (c) 2009 Holger Just
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/init.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/init.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,102 @@
+require 'redmine'
+
+require 'dispatcher'
+Dispatcher.to_prepare do
+ # Patches
+ require_dependency 'checkout/settings_controller_patch'
+
+ require_dependency 'checkout/repositories_helper_patch'
+ require_dependency 'checkout/repository_patch'
+
+ require_dependency 'checkout/settings_helper_patch'
+ require_dependency 'checkout/setting_patch'
+end
+
+# Hooks
+require 'checkout/repository_hooks'
+
+Redmine::Plugin.register :redmine_checkout do
+ name 'Redmine Checkout plugin'
+ url 'http://dev.holgerjust.de/projects/redmine-checkout'
+ author 'Holger Just'
+ author_url 'http://meine-er.de'
+ description 'Add links to the actual repository to the repository view.'
+ version '0.5'
+
+ requires_redmine :version_or_higher => '0.9'
+
+ settings_defaults = HashWithIndifferentAccess.new({
+ 'display_login' => nil,
+ 'use_zero_clipboard' => '1',
+
+ 'display_checkout_info' => '1',
+ 'description_Abstract' => <<-EOF
+The data contained in this repository can be downloaded to your computer using one of several clients.
+Please see the documentation of your version control software client for more information.
+
+Please select the desired protocol below to get the URL.
+EOF
+ })
+
+ # this is needed for setting the defaults
+ require 'checkout/repository_patch'
+
+ CheckoutHelper.supported_scm.each do |scm|
+ klazz = "Repository::#{scm}".constantize
+
+ settings_defaults["description_#{scm}"] = ''
+ settings_defaults["overwrite_description_#{scm}"] = '0'
+ settings_defaults["display_command_#{scm}"] = '0'
+
+ # access can be one of
+ # read+write => this protocol always allows read/write access
+ # read-only => this protocol always allows read access only
+ # permission => Access depends on redmine permissions
+ settings_defaults["protocols_#{scm}"] = [HashWithIndifferentAccess.new({
+ :protocol => scm,
+ :command => klazz.checkout_default_command,
+ :regex => '',
+ :regex_replacement => '',
+ :fixed_url => '',
+ :access => 'permission',
+ :append_path => (klazz.allow_subtree_checkout? ? '1' : '0'),
+ :is_default => '1'
+ })]
+ end
+
+ settings :default => settings_defaults, :partial => 'settings/redmine_checkout'
+
+ Redmine::WikiFormatting::Macros.register do
+ desc <<-EOF
+Creates a checkout link to the actual repository. Example:
+
+ use the default checkout protocol !{{repository}}
+ or use a specific protocol !{{repository(SVN)}}
+ or use the checkout protocol of a specific specific project: !{{repository(projectname:SVN)}}"
+EOF
+
+ macro :repository do |obj, args|
+ proto = args.first
+ if proto.to_s =~ %r{^([^\:]+)\:(.*)$}
+ project_identifier, proto = $1, $2
+ project = Project.find_by_identifier(project_identifier) || Project.find_by_name(project_identifier)
+ else
+ project = @project
+ end
+
+ if project && project.repository
+ protocols = project.repository.checkout_protocols.select{|p| p.access_rw(User.current)}
+
+ if proto.present?
+ proto_obj = protocols.find{|p| p.protocol.downcase == proto.downcase}
+ else
+ proto_obj = protocols.find(&:default?) || protocols.first
+ end
+ end
+ raise "Checkout protocol #{proto} not found" unless proto_obj
+
+ cmd = (project.repository.checkout_display_command? && proto_obj.command.present?) ? proto_obj.command.strip + " " : ""
+ cmd + link_to(proto_obj.url, proto_obj.url)
+ end
+ end
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/lib/checkout/protocol.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/lib/checkout/protocol.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,114 @@
+module Checkout
+ class < 0
+ end
+
+ def command
+ @command || self.repository && self.repository.checkout_default_command || ""
+ end
+
+ def append_path?
+ @append_path.to_i > 0
+ end
+
+ def access_rw(user)
+ # reduces the three available access levels 'read+write', 'read-only' and 'permission'
+ # to 'read+write' and 'read-only' and nil (not allowed)
+
+ @access_rw ||= {}
+ return @access_rw[user] if @access_rw.key? user
+ @access_rw[user] = case access
+ when 'permission'
+ case
+ when user.allowed_to?(:commit_access, repository.project) && user.allowed_to?(:browse_repository, repository.project)
+ 'read+write'
+ when user.allowed_to?(:browse_repository, repository.project)
+ 'read-only'
+ else
+ nil
+ end
+ else
+ @access
+ end
+ end
+
+ def access_label(user)
+ case access_rw(user)
+ when 'read+write': :label_access_read_write
+ when 'read-only': :label_access_read_only
+ end
+ end
+
+ def fixed_url
+ @fixed_url.present? ? @fixed_url : begin
+ if (regex.blank? || regex_replacement.blank?)
+ repository.url
+ else
+ repository.url.gsub(Regexp.new(regex), regex_replacement)
+ end
+ end
+ rescue RegexpError
+ repository.url || ""
+ end
+
+ def url(path = "")
+ return "" unless repository
+
+ url = fixed_url.sub(/\/+$/, "")
+ if repository.allow_subtree_checkout? && self.append_path? && path.present?
+ url = "#{url}/#{path}"
+ end
+
+ if repository.checkout_display_login?
+ begin
+ uri = URI.parse url
+ (uri.user = repository.login) if repository.login
+ (uri.password = repository.password) if (repository.checkout_display_login == 'password' && repository.login && repository.password)
+ url = uri.to_s
+ rescue URI::InvalidURIError
+ end
+ end
+ url
+ end
+ end
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/lib/checkout/repositories_helper_patch.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/lib/checkout/repositories_helper_patch.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,34 @@
+require_dependency 'repositories_helper'
+
+module Checkout
+ module RepositoriesHelperPatch
+ def self.included(base) # :nodoc:
+ base.send(:include, InstanceMethods)
+
+ base.class_eval do
+ alias_method_chain :repository_field_tags, :checkout
+ alias_method_chain :scm_select_tag, :javascript
+ end
+ end
+
+ module InstanceMethods
+ def repository_field_tags_with_checkout(form, repository)
+ tags = repository_field_tags_without_checkout(form, repository) || ""
+ return tags if repository.class.name == "Repository"
+
+ tags + @controller.send(:render_to_string, :partial => 'projects/settings/repository_checkout', :locals => {:form => form, :repository => repository, :scm => repository.scm_name})
+ end
+
+ def scm_select_tag_with_javascript(*args)
+ content_for :header_tags do
+ javascript_include_tag('subform', :plugin => 'redmine_checkout') +
+ stylesheet_link_tag('checkout', :plugin => 'redmine_checkout')
+ end
+ scm_select_tag_without_javascript(*args)
+ end
+ end
+ end
+end
+
+RepositoriesHelper.send(:include, Checkout::RepositoriesHelperPatch)
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/lib/checkout/repository_hooks.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/lib/checkout/repository_hooks.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,34 @@
+module Checkout
+ class RepositoryHooks < Redmine::Hook::ViewListener
+ # Renders the checkout URL
+ #
+ # Context:
+ # * :project => Current project
+ # * :repository => Current Repository
+ #
+ def view_repositories_show_contextual(context={})
+ if context[:repository].present? && Setting.checkout_display_checkout_info?
+ protocols = context[:repository].checkout_protocols.select do |p|
+ p.access_rw(User.current)
+ end
+
+ path = context[:controller].instance_variable_get("@path")
+ if path && context[:controller].instance_variable_get("@entry")
+ # a single file is showing, so we return only the directory
+ path = File.dirname(path)
+ end
+
+ default = protocols.find(&:default?) || protocols.first
+
+ context.merge!({
+ :protocols => protocols,
+ :default_protocol => default,
+ :checkout_path => path
+ })
+
+ options = {:partial => "redmine_checkout_hooks/view_repositories_show_contextual"}
+ context[:controller].send(:render_to_string, {:locals => context}.merge(options))
+ end
+ end
+ end
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/lib/checkout/repository_patch.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/lib/checkout/repository_patch.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,186 @@
+require_dependency 'repository'
+require_dependency 'checkout_helper'
+
+module Checkout
+ module RepositoryPatch
+ def self.included(base) # :nodoc:
+ base.extend(ClassMethods)
+ base.send(:include, InstanceMethods)
+
+ base.class_eval do
+ unloadable
+ serialize :checkout_settings, Hash
+ end
+ end
+
+ module ClassMethods
+ def allow_subtree_checkout?
+ # default implementation
+ false
+ end
+
+ def checkout_default_command
+ # default implementation
+ ""
+ end
+ end
+
+ module InstanceMethods
+ def after_initialize
+ self.checkout_settings ||= {}
+ end
+
+ def checkout_overwrite=(value)
+ checkout_settings['checkout_overwrite'] = value
+ end
+
+ def checkout_overwrite
+ (checkout_settings['checkout_overwrite'].to_i > 0) ? '1' : '0'
+ end
+
+ def checkout_overwrite?
+ self.scm_name != 'Abstract' && checkout_overwrite.to_i > 0
+ end
+
+ def checkout_description=(value)
+ checkout_settings['checkout_description'] = value
+ end
+
+ def checkout_description
+ if checkout_overwrite?
+ checkout_settings['checkout_description']
+ else
+ if CheckoutHelper.supported_scm.include?(scm_name) && Setting.send("checkout_overwrite_description_#{scm_name}?")
+ Setting.send("checkout_description_#{scm_name}")
+ else
+ Setting.send("checkout_description_Abstract")
+ end
+ end
+ end
+
+ def checkout_protocols
+ @checkout_protocols ||= begin
+ if CheckoutHelper.supported_scm.include? scm_name
+ if checkout_overwrite?
+ protocols = checkout_settings['checkout_protocols'] || []
+ else
+ protocols = Setting.send("checkout_protocols_#{scm_name}") || []
+ end
+ else
+ protocols = []
+ end
+
+ protocols.collect do |p|
+ Checkout::Protocol.new p.merge({:repository => self})
+ end
+ end
+ end
+
+ def checkout_protocols=(value)
+ # value is an Array or a Hash
+ if value.is_a? Hash
+ value = value.dup.delete_if {|id, protocol| id.to_i < 0 }
+ value = value.sort{|(ak,av),(bk,bv)|ak<=>bk}.collect{|id,protocol| protocol}
+ end
+
+ checkout_settings['checkout_protocols'] = value
+ end
+
+ def checkout_display_login
+ if checkout_overwrite? && self.scm_name == "Subversion"
+ result = checkout_settings['checkout_display_login']
+ else
+ result = Setting.checkout_display_login
+ end
+ (result.to_i > 0) ? '1' : '0'
+ end
+
+ def checkout_display_login?
+ checkout_display_login.to_i > 0
+ end
+
+ def checkout_display_login=(value)
+ value = nil unless self.scm_name == "Subversion"
+ checkout_settings['checkout_display_login'] = value
+ end
+
+ def checkout_display_command?
+ checkout_display_command.to_i > 0
+ end
+
+ def checkout_display_command=(value)
+ checkout_settings['checkout_display_command'] = value
+ end
+
+ def checkout_display_command
+ if checkout_overwrite?
+ checkout_settings['checkout_display_command']
+ else
+ Setting.send("checkout_display_command_#{scm_name}")
+ end
+ end
+
+ def allow_subtree_checkout?
+ self.class.allow_subtree_checkout?
+ end
+
+ def checkout_default_command
+ self.class.checkout_default_command
+ end
+ end
+ end
+end
+
+Repository.send(:include, Checkout::RepositoryPatch)
+
+subtree_checkout_repos = ["Subversion", "Cvs"]
+commands = {
+ 'Bazaar' => 'bzr checkout',
+ 'Cvs' => 'cvs checkout',
+ 'Darcs' => 'darcs get',
+ 'Git' => 'git clone',
+ 'Mercurial' => 'hg clone',
+ 'Subversion' => 'svn checkout'
+}
+
+CheckoutHelper.supported_scm.each do |scm|
+ require_dependency "repository/#{scm.underscore}"
+ cls = Repository.const_get(scm)
+
+ allow_subtree_checkout = ""
+ if subtree_checkout_repos.include? scm
+ allow_subtree_checkout = <<-EOS
+ def allow_subtree_checkout?
+ true
+ end
+ EOS
+ end
+
+ checkout_command = ""
+ if commands[scm]
+ checkout_command = <<-EOS
+ def checkout_default_command
+ '#{commands[scm]}'
+ end
+ EOS
+ end
+
+ class_mod = Module.new
+ class_mod.module_eval(<<-EOF
+ def self.included(base)
+ base.extend ChildClassMethods
+
+ base.class_eval do
+ unloadable
+ serialize :checkout_settings, Hash
+ end
+ end
+
+ module ChildClassMethods
+ #{allow_subtree_checkout}
+ #{checkout_command}
+ end
+ EOF
+ )
+ cls.send(:include, class_mod)
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/lib/checkout/setting_patch.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/lib/checkout/setting_patch.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,75 @@
+require_dependency 'setting'
+
+module Checkout
+ module SettingPatch
+ def self.included(base) # :nodoc:
+ base.extend(ClassMethods)
+
+ base.class_eval do
+ unloadable
+
+ # Defines getter and setter for each setting
+ # Then setting values can be read using: Setting.some_setting_name
+ # or set using Setting.some_setting_name = "some value"
+ Redmine::Plugin.find(:redmine_checkout).settings[:default].keys.each do |name|
+ if name.start_with?('protocols_')
+ default = "[]"
+ else
+ default = <<-END_SRC
+ begin
+ default = Setting.available_settings['plugin_redmine_checkout']['default']['#{name}']
+ # perform a deep copy of the default
+ Marshal::load(Marshal::dump(default))
+ end
+ END_SRC
+ end
+
+ src = <<-END_SRC
+ def self.checkout_#{name}
+ self.plugin_redmine_checkout[:#{name}] || #{default}
+ end
+
+ def self.checkout_#{name}?
+ self.checkout_#{name}.to_i > 0
+ end
+
+ def self.checkout_#{name}=(value)
+ setting = Setting.plugin_redmine_checkout
+ setting[:#{name}] = value
+ Setting.plugin_redmine_checkout = setting
+ end
+ END_SRC
+ class_eval src, __FILE__, __LINE__
+ end
+
+ class <bk}.collect{|id,protocol| protocol} if name.start_with? "protocols_"
+ end
+ settings[name.to_sym] = value
+ end
+ end
+
+ Setting.plugin_redmine_checkout = settings
+ params[:settings] = {}
+ end
+ end
+ edit_without_checkout
+ end
+ end
+ end
+end
+
+SettingsController.send(:include, Checkout::SettingsControllerPatch)
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/lib/checkout/settings_helper_patch.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/lib/checkout/settings_helper_patch.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,23 @@
+require_dependency 'settings_helper'
+
+module Checkout
+ module SettingsHelperPatch
+ def self.included(base) # :nodoc:
+ base.send(:include, InstanceMethods)
+
+ base.class_eval do
+ alias_method_chain :administration_settings_tabs, :checkout
+ end
+ end
+
+ module InstanceMethods
+ def administration_settings_tabs_with_checkout
+ tabs = administration_settings_tabs_without_checkout
+ tabs << {:name => 'checkout', :partial => 'settings/checkout', :label => :label_checkout}
+ end
+ end
+ end
+end
+
+SettingsHelper.send(:include, Checkout::SettingsHelperPatch)
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/lib/checkout_helper.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/lib/checkout_helper.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,7 @@
+module CheckoutHelper
+ class < :environment do
+ Repository.all.each{|r| r.update_attributes(:checkout_overwrite => "0")}
+ end
+ end
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/lib/tasks/spec.rake
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/lib/tasks/spec.rake Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,14 @@
+begin
+ require "spec/rake/spectask"
+ namespace :spec do
+ namespace :plugins do
+ desc "Runs the examples for redmine_checkout"
+ Spec::Rake::SpecTask.new(:redmine_checkout) do |t|
+ t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
+ t.spec_files = FileList['vendor/plugins/redmine_checkout/spec/**/*_spec.rb']
+ end
+ end
+ end
+ task :spec => "spec:plugins:redmine_checkout"
+rescue LoadError
+end
\ No newline at end of file
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/spec/controllers/repositories_controller_spec.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/spec/controllers/repositories_controller_spec.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,48 @@
+require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+
+describe RepositoriesController do
+ fixtures :settings, :repositories, :projects, :roles, :users, :enabled_modules
+ integrate_views
+
+ before(:each) do
+ Setting.default_language = 'en'
+ User.current = nil
+ end
+
+ def get_repo
+ get :show, :id => 1
+ end
+
+ it "should display the protocol selector" do
+ get_repo
+ response.should be_success
+ response.should render_template('show')
+
+ response.should have_tag('ul#checkout_protocols') do
+ with_tag('a[id=?][href=?]', 'checkout_protocol_subversion', "file:///#{RAILS_ROOT.gsub(%r{config\/\.\.}, '')}/tmp/test/subversion_repository")
+ with_tag('a[id=?][href=?]', 'checkout_protocol_svn+ssh', 'svn+ssh://subversion_repository@svn.foo.bar/svn')
+ end
+ end
+
+ it "should display the description" do
+ get_repo
+ response.should be_success
+ response.should render_template('show')
+
+ response.should have_tag('div.repository-info', /Please select the desired protocol below to get the URL/)
+ end
+
+ it 'should respect the use zero clipboard option' do
+ Setting.checkout_use_zero_clipboard = '1'
+ get_repo
+ response.should be_success
+ response.should render_template('show')
+ response.should have_tag('script[src*=?]', 'ZeroClipboard')
+
+ Setting.checkout_use_zero_clipboard = '0'
+ get_repo
+ response.should be_success
+ response.should render_template('show')
+ response.should_not have_tag('script[src*=]', 'ZeroClipboard')
+ end
+end
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/spec/fixtures/enabled_modules.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/spec/fixtures/enabled_modules.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,5 @@
+---
+enabled_modules_001:
+ name: repository
+ project_id: 1
+ id: 1
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/spec/fixtures/projects.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/spec/fixtures/projects.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,13 @@
+---
+projects_001:
+ created_on: 2006-07-19 19:13:59 +02:00
+ name: eCookbook
+ updated_on: 2006-07-19 22:53:01 +02:00
+ id: 1
+ description: Recipes management application
+ homepage: http://ecookbook.somenet.foo/
+ is_public: true
+ identifier: ecookbook
+ parent_id:
+ lft: 1
+ rgt: 10
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/spec/fixtures/repositories.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/spec/fixtures/repositories.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,9 @@
+---
+svn:
+ project_id: 1
+ url: file:///<%= RAILS_ROOT.gsub(%r{config\/\.\.}, '') %>/tmp/test/subversion_repository
+ id: 1
+ root_url: file:///<%= RAILS_ROOT.gsub(%r{config\/\.\.}, '') %>/tmp/test/subversion_repository
+ password: ""
+ login: ""
+ type: Subversion
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/spec/fixtures/roles.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/spec/fixtures/roles.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,187 @@
+---
+roles_001:
+ name: Manager
+ id: 1
+ builtin: 0
+ permissions: |
+ ---
+ - :add_project
+ - :edit_project
+ - :manage_members
+ - :manage_versions
+ - :manage_categories
+ - :view_issues
+ - :add_issues
+ - :edit_issues
+ - :manage_issue_relations
+ - :manage_subtasks
+ - :add_issue_notes
+ - :move_issues
+ - :delete_issues
+ - :view_issue_watchers
+ - :add_issue_watchers
+ - :delete_issue_watchers
+ - :manage_public_queries
+ - :save_queries
+ - :view_gantt
+ - :view_calendar
+ - :log_time
+ - :view_time_entries
+ - :edit_time_entries
+ - :delete_time_entries
+ - :manage_news
+ - :comment_news
+ - :view_documents
+ - :manage_documents
+ - :view_wiki_pages
+ - :export_wiki_pages
+ - :view_wiki_edits
+ - :edit_wiki_pages
+ - :delete_wiki_pages_attachments
+ - :protect_wiki_pages
+ - :delete_wiki_pages
+ - :rename_wiki_pages
+ - :add_messages
+ - :edit_messages
+ - :delete_messages
+ - :manage_boards
+ - :view_files
+ - :manage_files
+ - :browse_repository
+ - :manage_repository
+ - :view_changesets
+ - :manage_project_activities
+
+ position: 1
+roles_002:
+ name: Developer
+ id: 2
+ builtin: 0
+ permissions: |
+ ---
+ - :edit_project
+ - :manage_members
+ - :manage_versions
+ - :manage_categories
+ - :view_issues
+ - :add_issues
+ - :edit_issues
+ - :manage_issue_relations
+ - :manage_subtasks
+ - :add_issue_notes
+ - :move_issues
+ - :delete_issues
+ - :view_issue_watchers
+ - :save_queries
+ - :view_gantt
+ - :view_calendar
+ - :log_time
+ - :view_time_entries
+ - :edit_own_time_entries
+ - :manage_news
+ - :comment_news
+ - :view_documents
+ - :manage_documents
+ - :view_wiki_pages
+ - :view_wiki_edits
+ - :edit_wiki_pages
+ - :protect_wiki_pages
+ - :delete_wiki_pages
+ - :add_messages
+ - :edit_own_messages
+ - :delete_own_messages
+ - :manage_boards
+ - :view_files
+ - :manage_files
+ - :browse_repository
+ - :view_changesets
+
+ position: 2
+roles_003:
+ name: Reporter
+ id: 3
+ builtin: 0
+ permissions: |
+ ---
+ - :edit_project
+ - :manage_members
+ - :manage_versions
+ - :manage_categories
+ - :view_issues
+ - :add_issues
+ - :edit_issues
+ - :manage_issue_relations
+ - :add_issue_notes
+ - :move_issues
+ - :view_issue_watchers
+ - :save_queries
+ - :view_gantt
+ - :view_calendar
+ - :log_time
+ - :view_time_entries
+ - :manage_news
+ - :comment_news
+ - :view_documents
+ - :manage_documents
+ - :view_wiki_pages
+ - :view_wiki_edits
+ - :edit_wiki_pages
+ - :delete_wiki_pages
+ - :add_messages
+ - :manage_boards
+ - :view_files
+ - :manage_files
+ - :browse_repository
+ - :view_changesets
+
+ position: 3
+roles_004:
+ name: Non member
+ id: 4
+ builtin: 1
+ permissions: |
+ ---
+ - :view_issues
+ - :add_issues
+ - :edit_issues
+ - :manage_issue_relations
+ - :add_issue_notes
+ - :move_issues
+ - :save_queries
+ - :view_gantt
+ - :view_calendar
+ - :log_time
+ - :view_time_entries
+ - :comment_news
+ - :view_documents
+ - :manage_documents
+ - :view_wiki_pages
+ - :view_wiki_edits
+ - :edit_wiki_pages
+ - :add_messages
+ - :view_files
+ - :manage_files
+ - :browse_repository
+ - :view_changesets
+
+ position: 4
+roles_005:
+ name: Anonymous
+ id: 5
+ builtin: 2
+ permissions: |
+ ---
+ - :view_issues
+ - :add_issue_notes
+ - :view_gantt
+ - :view_calendar
+ - :view_time_entries
+ - :view_documents
+ - :view_wiki_pages
+ - :view_wiki_edits
+ - :view_files
+ - :browse_repository
+ - :view_changesets
+
+ position: 5
+
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/spec/fixtures/settings.yml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/spec/fixtures/settings.yml Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,115 @@
+---
+ settings:
+ name: plugin_redmine_checkout
+ value: |
+ --- !map:HashWithIndifferentAccess
+ display_checkout_info: "1"
+ description_Abstract: |
+ The data contained in this repository can be downloaded to your computer using one of several clients.
+ Please see the documentation of your version control software client for more information.
+
+ Please select the desired protocol below to get the URL.
+ display_command_Bazaar: '1'
+ use_zero_clipboard: "1"
+
+ overwrite_description_Bazaar: "0"
+ description_Bazaar: ""
+ display_command_Bazaar: '1'
+ protocols_Bazaar:
+ "0": !map:HashWithIndifferentAccess
+ command: "bzr checkout"
+ regex: ""
+ regex_replacement: ""
+ read_write: readwrite
+ append_path: "0"
+ is_default: "1"
+ protocol: Bazaar
+ overwrite_description_Cvs: "0"
+ description_Cvs: ""
+ display_command_Cvs: '1'
+ protocols_Cvs:
+ "0": !map:HashWithIndifferentAccess
+ command: "cvs checkout"
+ regex: ""
+ regex_replacement: ""
+ read_write: readwrite
+ append_path: "0"
+ is_default: "1"
+ protocol: Cvs
+ overwrite_description_Darcs: "0"
+ description_Darcs: ""
+ display_command_Darcs: '1'
+ protocols_Darcs:
+ "0": !map:HashWithIndifferentAccess
+ command: "darcs get"
+ regex: ""
+ regex_replacement: ""
+ read_write: readwrite
+ append_path: "0"
+ is_default: "1"
+ protocol: Darcs
+ overwrite_description_Filesystem: "0"
+ description_Filesystem: ""
+ display_command_Filesystem: '1'
+ protocols_Filesystem: !map:HashWithIndifferentAccess
+ "0": !map:HashWithIndifferentAccess
+ command: ""
+ regex: ""
+ append_path: "0"
+ is_default: "1"
+ protocol: Filesystem
+ access: read+write
+ regex_replacement: ""
+ overwrite_description_Git: "0"
+ description_Git: ""
+ display_command_Git: '1'
+ protocols_Git: !map:HashWithIndifferentAccess
+ "0": !map:HashWithIndifferentAccess
+ command: "git clone"
+ regex: ""
+ append_path: "0"
+ is_default: "1"
+ protocol: Git
+ access: read+write
+ regex_replacement: ""
+ overwrite_description_Mercurial: "0"
+ description_Mercurial: ""
+ display_command_Mercurial: '1'
+ protocols_Mercurial: !map:HashWithIndifferentAccess
+ "0": !map:HashWithIndifferentAccess
+ command: "hg clone"
+ regex: ""
+ append_path: "0"
+ is_default: "1"
+ protocol: Mercurial
+ access: read+write
+ regex_replacement: ""
+ display_login: username
+ overwrite_description_Subversion: "0"
+ description_Subversion: ""
+ display_command_Subversion: '1'
+ protocols_Subversion: !map:HashWithIndifferentAccess
+ "0": !map:HashWithIndifferentAccess
+ command: "svn checkout"
+ regex: foo
+ append_path: "1"
+ is_default: "1"
+ protocol: Subversion
+ access: permission
+ regex_replacement: bar
+ "1": !map:HashWithIndifferentAccess
+ command: "svn co"
+ regex: "^.*?([^/]+)/?$"
+ append_path: "1"
+ is_default: "0"
+ protocol: SVN+SSH
+ access: read-only
+ regex_replacement: svn+ssh://\1@svn.foo.bar/svn
+ "2": !map:HashWithIndifferentAccess
+ command: "svn checkout"
+ append_path: "0"
+ is_default: "0"
+ regex: ""
+ protocol: Root
+ access: read+write
+ regex_replacement: ""
diff -r 433d4f72a19b -r bb32da3bea34 vendor/plugins/redmine_checkout/spec/macros/macro_spec.rb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/plugins/redmine_checkout/spec/macros/macro_spec.rb Mon Jan 07 14:41:20 2013 +0000
@@ -0,0 +1,55 @@
+require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
+
+describe "Macros" do
+ fixtures :settings, :repositories, :projects, :enabled_modules
+
+ include ERB::Util
+ include ApplicationHelper
+ include ActionView::Helpers::TextHelper
+ include ActionView::Helpers::TagHelper
+ include ActionView::Helpers::UrlHelper
+
+ before(:each) do
+ Setting.checkout_display_command_Subversion = '0'
+
+ @project = projects :projects_001
+ end
+
+
+ it "should display default checkout url" do
+ text = "{{repository}}"
+
+ url = "file:///#{RAILS_ROOT.gsub(%r{config\/\.\.}, '')}/tmp/test/subversion_repository"
+ textilizable(text).should eql "#{url}
"
+ end
+
+ it "should display forced checkout url" do
+ text = "{{repository(svn+ssh)}}"
+
+ url = 'svn+ssh://subversion_repository@svn.foo.bar/svn'
+ textilizable(text).should eql "#{url}
"
+ end
+
+ it "should fail without set project" do
+ @project = nil
+
+ text = "{{repository(svn+ssh)}}"
+ textilizable(text).should eql "
Error executing the repository macro (Checkout protocol svn+ssh not found)