elexis-wiki-interface 0.4.8 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -1
  3. data/Gemfile.lock +25 -1
  4. data/README.textile +2 -3
  5. data/bin/wiki_pull +6 -3
  6. data/bin/wiki_pull_and_commit +38 -0
  7. data/bin/wiki_push +2 -2
  8. data/elexis-wiki-interface.gemspec +4 -3
  9. data/history.textile +14 -0
  10. data/lib/elexis/wiki/images.rb +338 -0
  11. data/lib/elexis/wiki/interface.rb +152 -2
  12. data/lib/elexis/wiki/version.rb +5 -0
  13. data/lib/elexis/wiki/workspace.rb +286 -0
  14. data/spec/data/images/ch.elexis.agenda/.project +36 -0
  15. data/spec/data/images/ch.elexis.agenda/META-INF/MANIFEST.MF +33 -0
  16. data/spec/data/images/ch.elexis.agenda/doc/fixmedikationaufruf.png +0 -0
  17. data/spec/data/images/ch.elexis.agenda/plugin.properties +8 -0
  18. data/spec/data/images/ch.elexis.agenda/plugin.xml +209 -0
  19. data/spec/data/images/ch.elexis.agenda/plugin_de.properties +8 -0
  20. data/spec/data/images/ch.elexis.agenda/plugin_en.properties +8 -0
  21. data/spec/data/images/ch.elexis.agenda/plugin_fr.properties +7 -0
  22. data/spec/data/images/ch.elexis.core.application.feature/.project +23 -0
  23. data/spec/data/images/ch.elexis.core.application.feature/build.properties +1 -0
  24. data/spec/data/images/ch.elexis.core.application.feature/feature.xml +699 -0
  25. data/spec/data/images/ch.elexis.core.application.feature/pom.xml +12 -0
  26. data/spec/data/images/ch.elexis.icpc/.project +28 -0
  27. data/spec/data/images/ch.elexis.icpc/META-INF/MANIFEST.MF +26 -0
  28. data/spec/data/images/ch.elexis.icpc/doc/Com.hilotec.elexis.opendocument_anleitung_opendocument_1.png +0 -0
  29. data/spec/data/images/ch.elexis.icpc/doc/FixmedikationAufruf.png +0 -0
  30. data/spec/data/images/ch.elexis.icpc/doc/Icpc8.png +0 -0
  31. data/spec/data/images/ch.elexis.icpc/doc/ch.elexis.icpc_icpc1.png +0 -0
  32. data/spec/data/images/ch.elexis.icpc/doc/disposan.gif +0 -0
  33. data/spec/data/images/ch.elexis.icpc/doc/elexis_logo.jpg +0 -0
  34. data/spec/data/images/ch.elexis.icpc/doc/favicon_green.png +0 -0
  35. data/spec/data/images/ch.elexis.icpc/doc/icpc0.png +0 -0
  36. data/spec/data/images/ch.elexis.icpc/doc/icpc1.png +0 -0
  37. data/spec/data/images/ch.elexis.icpc/doc/icpc2.png +0 -0
  38. data/spec/data/images/ch.elexis.icpc/doc/icpc3.png +0 -0
  39. data/spec/data/images/ch.elexis.icpc/doc/icpc4.png +0 -0
  40. data/spec/data/images/ch.elexis.icpc/doc/icpc5.png +0 -0
  41. data/spec/data/images/ch.elexis.icpc/doc/icpc6.png +0 -0
  42. data/spec/data/images/ch.elexis.icpc/doc/icpc7.png +0 -0
  43. data/spec/data/images/ch.elexis.icpc/doc/icpc9.png +0 -0
  44. data/spec/data/images/ch.elexis.icpc/doc/kabel.png +0 -0
  45. data/spec/data/images/ch.elexis.icpc/doc/medevit_inbox1.png +0 -0
  46. data/spec/data/images/ch.elexis.icpc/doc/test.mediawiki +15 -0
  47. data/spec/data/images/ch.elexis.icpc/doc/test2.mediawiki +19 -0
  48. data/spec/data/images/ch.elexis.icpc/plugin.xml +74 -0
  49. data/spec/data/images/ch.elexis.notes/.project +34 -0
  50. data/spec/data/images/ch.elexis.notes/META-INF/MANIFEST.MF +17 -0
  51. data/spec/data/images/ch.elexis.notes/doc/At.medevit.medelexis.text.msword:WordBriefe.png +0 -0
  52. data/spec/data/images/ch.elexis.notes/doc/Ch.medelexis.openoffice:TextverarbeitungSettings.png +0 -0
  53. data/spec/data/images/ch.elexis.notes/doc/Icpc1.png +0 -0
  54. data/spec/data/images/ch.elexis.notes/doc/kabel.png +0 -0
  55. data/spec/data/images/ch.elexis.notes/doc/medidirect:use2.png +0 -0
  56. data/spec/data/images/ch.elexis.notes/doc/test.mediawiki +13 -0
  57. data/spec/data/images/ch.elexis.notes/plugin.properties +1 -0
  58. data/spec/data/images/ch.elexis.notes/plugin.xml +36 -0
  59. data/spec/data/images/ch.elexis.notes/plugin_de.properties +3 -0
  60. data/spec/data/images/ch.elexis.notes/plugin_en.properties +3 -0
  61. data/spec/data/images/ch.elexis.notes/plugin_fr.properties +3 -0
  62. data/spec/data/images/doc_de/.project +42 -0
  63. data/spec/data/images/elexis_api_test.png +0 -0
  64. data/spec/data/push/elexis_api_test.png +0 -0
  65. data/spec/images_spec.rb +236 -0
  66. data/spec/interface_spec.rb +118 -0
  67. data/spec/pull_spec.rb +16 -5
  68. metadata +128 -13
  69. data/History.txt +0 -41
  70. data/bin/wiki_pull_daily +0 -28
  71. data/lib/elexis/wiki/interface/version.rb +0 -7
  72. data/lib/elexis/wiki/interface/workspace.rb +0 -404
  73. data/spec/push_spec.rb +0 -31
  74. data/spec/update_images_spec.rb +0 -95
  75. data/spec/user_spec.rb +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dcd4309470e3954cecd1e5d35c7a75efa7a453be
4
- data.tar.gz: db7566d5c5ba624c72e3b08a084cf4f7e4b45091
3
+ metadata.gz: 4ce49a15cb845a0cdfc0877279106c0c3f07ac9a
4
+ data.tar.gz: f18d578327aa1ddf483de7036b12747fd37067fd
5
5
  SHA512:
6
- metadata.gz: 7981f2ce10eb3c5be76ba97c47764f53623a1f083952a123accaeb9e2729f68e70ae261b45e0e55d873419145e2c861bbee2dd4eba258cd0de4c08e6b621a0db
7
- data.tar.gz: 8290acb38b2b5543cf6d467550bc7f02a4be7dd9aa14b9bfeaa6df5fa61eddfc4d530511361ea87a2880a14008b4ff6adcc20c02ceb42aaf40d7d4c3f41605f8
6
+ metadata.gz: b97ac0b5d7affd17837da3ed44058c56b1bcc459b6fbb6351b3ea0509af483bdc722c45588bcb0edab24d0ac8995cd9b030b1c0d3c6f01cdb7467144c92d1261
7
+ data.tar.gz: bbea945c3ac300dd6adfa5e0f798486b3da44ed90b902ba65fc28c09ef9a6d39cde5f99825aff686cb815c5dc77606a7976cea55c8972d9495cf2b572378a418
data/Gemfile CHANGED
@@ -5,4 +5,6 @@ gemspec
5
5
 
6
6
 
7
7
  gem 'eclipse-plugin' # , :git => 'https://github.com/ngiger/eclipse-plugin'
8
- # gem 'pry-nav'
8
+ group :debugger do
9
+ gem 'pry-byebug'
10
+ end
data/Gemfile.lock CHANGED
@@ -1,15 +1,20 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- elexis-wiki-interface (0.4.8)
4
+ elexis-wiki-interface (0.5.0)
5
5
  eclipse-plugin (>= 0.1)
6
6
  mediawiki-gateway
7
+ mediawiki_api
7
8
  rubyzip (< 1.0.0)
8
9
  unicode
9
10
 
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
14
+ byebug (5.0.0)
15
+ columnize (= 0.9.0)
16
+ coderay (1.1.0)
17
+ columnize (0.9.0)
13
18
  diff-lcs (1.2.5)
14
19
  docile (1.1.5)
15
20
  domain_name (0.5.24)
@@ -17,16 +22,33 @@ GEM
17
22
  eclipse-plugin (0.3)
18
23
  nokogiri
19
24
  rubyzip (< 1.0.0)
25
+ faraday (0.9.1)
26
+ multipart-post (>= 1.2, < 3)
27
+ faraday-cookie_jar (0.0.6)
28
+ faraday (>= 0.7.4)
29
+ http-cookie (~> 1.0.0)
20
30
  http-cookie (1.0.2)
21
31
  domain_name (~> 0.5)
22
32
  json (1.8.3)
23
33
  mediawiki-gateway (1.0.0)
24
34
  rest-client (~> 1.7)
35
+ mediawiki_api (0.5.0)
36
+ faraday (~> 0.9, >= 0.9.0)
37
+ faraday-cookie_jar (~> 0.0, >= 0.0.6)
38
+ method_source (0.8.2)
25
39
  mime-types (2.6.1)
26
40
  mini_portile (0.6.2)
41
+ multipart-post (2.0.0)
27
42
  netrc (0.10.3)
28
43
  nokogiri (1.6.6.2)
29
44
  mini_portile (~> 0.6.0)
45
+ pry (0.10.1)
46
+ coderay (~> 1.1.0)
47
+ method_source (~> 0.8.1)
48
+ slop (~> 3.4)
49
+ pry-byebug (3.2.0)
50
+ byebug (~> 5.0)
51
+ pry (~> 0.10)
30
52
  rake (10.4.2)
31
53
  rest-client (1.8.0)
32
54
  http-cookie (>= 1.0.2, < 2.0)
@@ -51,6 +73,7 @@ GEM
51
73
  json (~> 1.8)
52
74
  simplecov-html (~> 0.10.0)
53
75
  simplecov-html (0.10.0)
76
+ slop (3.6.0)
54
77
  unf (0.1.4)
55
78
  unf_ext
56
79
  unf_ext (0.0.7.1)
@@ -63,6 +86,7 @@ DEPENDENCIES
63
86
  bundler (~> 1.10)
64
87
  eclipse-plugin
65
88
  elexis-wiki-interface!
89
+ pry-byebug
66
90
  rake (~> 10.0)
67
91
  rspec
68
92
  simplecov
data/README.textile CHANGED
@@ -12,7 +12,7 @@ Copyright: 2014 (c) by Niklaus Giger <niklaus.giger@member.fsf.org>
12
12
 
13
13
  h2. Installation
14
14
 
15
- Ensure that you use Ruby 1.9.2 or higher (mediawiki-gateway does not support Ruby 1.8.7).
15
+ Ensure that you use Ruby 1.9.2 or higher. Mediawiki 1.19 does not work. Mediawiki 1.25.2 works. Don't know how the versions between score.
16
16
 
17
17
  Add this line to your application's Gemfile:
18
18
 
@@ -79,9 +79,8 @@ Also we don't use the tag Datei, as this one is not supported by the Mylin Wikit
79
79
  ** a perspective perspective.name with a localized name localized_name has a page P_<localized_name>
80
80
  ** an image file must be lowercase (files which differ only by the case will be deleted)
81
81
  ** use syntax @[[File:@, not [[Datei: or @[[Image:@
82
- ** png files should start with their plugin/feature-name followed by '/' by a name or a globally unique name
82
+ ** png files should start with a name derived from their symbolic name, eg, molemax followed by '-' by a name or a globally unique name
83
83
  ** png files resides inside the 'doc' sub-directory of each plugin/feature
84
- ** inside the doc directoy we create a logical link of the plugin|feature name to the directory. This allows us to edit and preview the mediawiki files using the Mylin Wikitext extension of Eclipse.
85
84
 
86
85
  h3. Limitations/TODO
87
86
 
data/bin/wiki_pull CHANGED
@@ -1,6 +1,9 @@
1
1
  #!/bin/env ruby
2
- require 'elexis/wiki/interface/workspace'
3
-
4
- workspace = Elexis::Wiki::Interface::Workspace.new(Dir.pwd)
2
+ require 'elexis/wiki/workspace'
3
+ workspace = Elexis::Wiki::Workspace.new(Dir.pwd)
5
4
  workspace.pull
5
+
6
+ images = Elexis::Wiki::Images.new(Dir.pwd)
7
+ images.determine_cleanup
8
+ images.execute_cleanup
6
9
  workspace.show_missing(true)
@@ -0,0 +1,38 @@
1
+ #!/bin/env ruby
2
+
3
+ require 'elexis/wiki/workspace'
4
+
5
+ workspace = Elexis::Wiki::Workspace.new(Dir.pwd)
6
+ workspace.pull
7
+
8
+ images = Elexis::Wiki::Images.new(Dir.pwd)
9
+ images.determine_cleanup
10
+ images.execute_cleanup(true) # adds changes via git add
11
+
12
+ files = Dir.glob('doc_??') +
13
+ Dir.glob('*/doc/*.mediawiki', File::FNM_CASEFOLD) +
14
+ Dir.glob('*/doc/*.png', File::FNM_CASEFOLD)
15
+ Dir.glob('*/doc/*.jpg', File::FNM_CASEFOLD)
16
+ Dir.glob('*/doc/*.gif', File::FNM_CASEFOLD)
17
+ (Dir.glob("doc_??/*") + Dir.glob('*/doc/*')).each{|f| files << f if File.symlink?(f) }
18
+ files.each{
19
+ |file|
20
+ if /:/.match(File.basename(file))
21
+ puts "You may not add a file containg ':' or it will break git for Windows. Remove/rename #{file}"
22
+ exit 2
23
+ end
24
+ }
25
+
26
+ if (error_files = Dir.glob('**/*:*')) and error_files.size > 0
27
+ puts "You may not add a file containg ':' or it will break git for Windows. Remove/rename #{error_files}"
28
+ exit 3
29
+ end
30
+
31
+ if true
32
+ system("git status")
33
+ system("git commit --all -m '#{File.basename(__FILE__)}: #{Date.today.to_s} from #{workspace.if.wiki_url.sub(/api.php/i, '')}'")
34
+ system("git status")
35
+ system("git log -1")
36
+ # system("git push")
37
+ end
38
+ workspace.show_missing(true)
data/bin/wiki_push CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/bin/env ruby
2
- require 'elexis/wiki/interface/workspace'
3
- workspace = Elexis::Wiki::Interface::Workspace.new(Dir.pwd)
2
+ require 'elexis/wiki/workspace'
3
+ workspace = Elexis::Wiki::Workspace.new(Dir.pwd)
4
4
  workspace.push
5
5
 
@@ -1,11 +1,11 @@
1
1
  # coding: utf-8
2
2
  lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'elexis/wiki/interface/version'
4
+ require 'elexis/wiki/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "elexis-wiki-interface"
8
- spec.version = Elexis::Wiki::Interface::VERSION
8
+ spec.version = Elexis::Wiki::VERSION
9
9
  spec.authors = ["Niklaus Giger"]
10
10
  spec.email = ["niklaus.giger@member.fsf.org"]
11
11
  spec.summary = "Interface between elexis source and wiki"
@@ -19,7 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
  spec.add_dependency 'rubyzip', '< 1.0.0'
21
21
  spec.add_dependency 'unicode'
22
- spec.add_dependency 'mediawiki-gateway'
22
+ spec.add_dependency 'mediawiki-gateway' # needed to get pages and infos about pages
23
+ spec.add_dependency 'mediawiki_api' # needed to push images
23
24
  spec.add_dependency 'eclipse-plugin', '>= 0.1'
24
25
  spec.add_development_dependency "bundler", "~> 1.10"
25
26
  spec.add_development_dependency "rake", "~> 10.0"
data/history.textile ADDED
@@ -0,0 +1,14 @@
1
+ h3. Version 0.5.0 (2015-09-18)
2
+
3
+ * Major cleanup, much more spec tests
4
+ * Refactored accessing the Wiki into the new class Interface
5
+ * Using direct json, mediawiki-gateway and mediawiki_api as I found no good gem, which does allow all stuff
6
+ * Requires newer mediawiki (actuall 1.25.2, 1.19 does not work. Unknown how it behaves between)
7
+ * Recognize duplicates in pictures
8
+ * Forces renaming of old convention with '/' or ':' in picture names
9
+ * Added pictures.csv|yml to store information about the seen picture (duplicates, etc)
10
+
11
+ h3. Version 0.4.8 (2015-08-15)
12
+
13
+ * Fails miserably uploading to Mediawiki 1.19
14
+
@@ -0,0 +1,338 @@
1
+ #encoding: utf-8
2
+
3
+ require 'eclipse/plugin'
4
+ require 'media_wiki'
5
+ require 'mediawiki_api'
6
+ require 'elexis/wiki/images'
7
+ require 'fileutils'
8
+ require 'open-uri'
9
+ require 'time'
10
+ require 'yaml'
11
+ require 'csv'
12
+
13
+ module Elexis
14
+ module Wiki
15
+ ImagePattern = /(\[File:|Datei:|\[Image:)([ \w\.\:\/]*)/i
16
+
17
+ #
18
+ # This helper class collect information about all images used in
19
+ # subdirectories doc ending with mediawiki and stores the results
20
+ # in a pictures.yml and a pictures.csv file
21
+ #
22
+ # Several helper allow showing unused pictures, identifying
23
+ # files with same name, but different content and pictures use
24
+ # in several sub-directories
25
+ #
26
+ class Images
27
+
28
+ private
29
+ def write_yml_and_csv
30
+ File.open(@yml, 'w+') {|f| f.puts @pictures.to_yaml}
31
+ column_header = ["sha256","name","project","path"]
32
+ CSV.open(csv, 'w+',
33
+ :write_headers=> true,
34
+ :headers => column_header
35
+ ) do |csv|
36
+ csv << ["# Generated by: #{File.basename(__FILE__)} at #{Time.now.utc}"]
37
+ @pictures.each{ |pict| csv << pict.values.to_a }
38
+ end
39
+ end
40
+ def initialize_database
41
+ savedDir = Dir.pwd
42
+ Dir.chdir(@rootDir)
43
+ @docs = Dir.glob('**/doc').reject{|x| x.match(/(^vendor|\/vendor)\//) } # doc_fr is mostly a duplicate of doc_de
44
+ @docs.each{
45
+ |doc_dir|
46
+ pngs = Dir.glob("#{doc_dir}/**/*.{png,jpg}")
47
+ puts "#{doc_dir} has #{pngs.size} png" if $VERBOSE
48
+ next if pngs.size == 0
49
+ pngs.each {
50
+ |png|
51
+ sha256 = Digest::SHA256.hexdigest(IO.read(png))
52
+ pict = { :sha256 => sha256,
53
+ :name => File.basename(png),
54
+ :project => File.basename(File.dirname(File.dirname(png))),
55
+ :path => png}
56
+ @pictures << pict
57
+ }
58
+ # break if pngs.size > 1
59
+ }
60
+ @sha_2_png = {}
61
+ @pictures.each {
62
+ |picture|
63
+ if @sha_2_png[picture[:sha256]]
64
+ @sha_2_png[picture[:sha256]] << picture
65
+ else
66
+ @sha_2_png[picture[:sha256]] = [picture]
67
+ end
68
+ }
69
+ @duplicates = @sha_2_png.find_all{|sha, list| list.size > 1}
70
+ write_yml_and_csv
71
+ ensure
72
+ Dir.chdir(savedDir)
73
+ end
74
+
75
+ def verify_best_name(picture)
76
+ if picture[:best_name]
77
+ wrong_best_name = @pictures.find_all{|x| x[:best_name] == picture[:best_name] and x[:sha256] != picture[:sha256]}
78
+ if wrong_best_name.size > 0
79
+ puts " #{wrong_best_name.size} entries #{wrong_best_name}" #if $VERBOSE
80
+ @wrong_best_name << [picture[:path], wrong_best_name.collect{|x| x[:path]} ]
81
+ new_name = get_name_with_project(picture[:path])
82
+ if picture[:best_name] != new_name
83
+ puts "new_best_name 2 is #{new_name} for #{picture[:path]}" #if $VERBOSE
84
+ picture[:rule] += " name get_name_with_project"
85
+ picture[:best_name] = new_name
86
+ else
87
+ @@uniq_id ||= 0
88
+ new_name = '27'
89
+ begin
90
+ @@uniq_id += 1
91
+ new_name = File.dirname(picture[:path]) + "/#{@@uniq_id}_" + picture[:name]
92
+ end until File.exist?(new_name).eql?(false)
93
+ puts "new_best_name 3 is #{new_name} for #{picture[:path]}" # if $VERBOSE
94
+ picture[:rule] += " third #{new_name}"
95
+ picture[:best_name] = File.basename(new_name)
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ def set_best_name(picture)
102
+ debug = $VERBOSE
103
+ path = picture[:path]
104
+ sha256 = Digest::SHA256.hexdigest(IO.read(path))
105
+ same_sha256 = @pictures.find_all{|x| x[:sha256] == sha256}
106
+ same_name = @pictures.find_all{|x| x[:name] == picture[:name]}
107
+ nrSha256 = same_name.collect{|c| get_small_name(c[:sha256])}.uniq
108
+ if same_sha256.size == 1 and nrSha256.size == 1
109
+ puts "new_best_name 3 @short_and_sha_okay #{sha256} for #{path}" if debug
110
+ picture[:rule] = 'short_and_sha_okay nr_single_sha'
111
+ @short_and_sha_okay << path
112
+ @nr_single_sha << same_sha256
113
+ picture[:best_name] = get_small_name(path)
114
+ return
115
+ else
116
+ msg = " nrSha #{sha256.size} #{sha256}"
117
+ if same_sha256.collect{|c| c[:name]}.uniq.size == 1 and nrSha256.size == 1
118
+ puts "@short_and_sha_okay #{path} sha256 #{sha256} for #{same_sha256.size} files" if debug
119
+ picture[:rule] = 'short_and_sha_okay'
120
+ @short_and_sha_okay << path
121
+ return
122
+ end
123
+ found = same_sha256.collect{|c| c[:name].downcase}.uniq
124
+ if found.size == 1 and nrSha256.size == 1
125
+ puts "new_best_name 4 case_sensitives #{found}" if debug
126
+ picture[:rule] = 'case_sensitives'
127
+ picture[:best_name] = get_small_name(path)
128
+ return
129
+ end
130
+ multiple = same_sha256.collect{|c| c[:name]}.uniq
131
+ to_reduce = same_sha256.collect{|c| get_small_name(c[:name])}.uniq
132
+ if nrSha256.size == 1
133
+ @to_short_names[path] = to_reduce
134
+ puts "new_best_name 5 to_short_names #{multiple} => #{to_reduce} nrSha #{sha256.size} #{sha256}" if debug
135
+ picture[:rule] = 'to_short_names'
136
+ picture[:best_name] = get_small_name(path)
137
+ return
138
+ end
139
+ puts "new_best_name 6 multiple #{multiple} to_reduce #{to_reduce} #{get_name_with_project(picture[:path])}" if debug
140
+ @multiple_names[path] = same_sha256
141
+ picture[:best_name] = get_name_with_project(picture[:path])
142
+ picture[:rule] = 'multiple_names'
143
+ return
144
+ end
145
+ end
146
+ public
147
+ attr_reader :rootDir, :docDir, :extension, :yml, :csv, :pictures, :sha_2_png,
148
+ :multiple_names, :to_short_names, :nr_single_sha,
149
+ :short_and_sha_okay, :wrong_best_name, :new_best_name,
150
+ :duplicates, :dup_non_identical, :actions
151
+
152
+ def initialize(rootDir = Dir.pwd, docDir = 'doc', extension = '.mediawiki')
153
+ @rootDir = rootDir
154
+ @docDir = docDir
155
+ @extension = extension
156
+ @add_changes_to_git = false
157
+ @pictures = []
158
+ @multiple_names = {}
159
+ @to_short_names = {}
160
+ @nr_single_sha = []
161
+ @short_and_sha_okay = []
162
+ @wrong_best_name = []
163
+ @new_best_name = {}
164
+ @yml = File.expand_path(File.join(@rootDir, 'pictures.yml'))
165
+ @csv = File.expand_path(File.join(@rootDir, 'pictures.csv'))
166
+ initialize_database
167
+ end
168
+
169
+ def get_name_with_project(path)
170
+ dir = File.dirname(path)
171
+ found = dir.sub(/(\.feature|[._]test.*|)\/doc/i, '').sub(/\.v\d$/, '')
172
+ result = (found.split('.')[-1] + '-' + File.basename(path)).downcase.gsub(':', '-')
173
+ result
174
+ end
175
+
176
+ def get_small_name(path)
177
+ ext = File.extname(path)
178
+ to_consider = File.basename(path, ext).gsub(':','-')
179
+ if to_consider.index('.')
180
+ part = to_consider.split('.')[-1].downcase
181
+ if part.split('_').size > 1
182
+ result = part.split('_')[1..-1].join('_')
183
+ else
184
+ result = part
185
+ end
186
+ else
187
+ result = to_consider
188
+ end
189
+ (result + ext).downcase
190
+ end
191
+
192
+ def determine_cleanup
193
+ savedDir = Dir.pwd
194
+ Dir.chdir(@rootDir)
195
+ @pictures.each{ |picture| set_best_name(picture) }
196
+ @pictures.each{ |picture| verify_best_name(picture) }
197
+ @wrong_best_name = []
198
+ @pictures.each{ |picture| verify_best_name(picture) }
199
+ @dup_non_identical = @pictures.collect{ |p| p[:path] if p[:rule] =~ /multiple/}.compact
200
+ @pictures.find{ |outer| @pictures.find_all{ |inner| inner[:name].eql?(outer[:name]) and not inner[:sha256].eql?(outer[:sha256])}.size > 1 }
201
+ @new_best_name = @pictures.find_all{ |picture| picture[:best_name] and not picture[:best_name].downcase.eql?(picture[:name].downcase) }
202
+ write_yml_and_csv
203
+ ensure
204
+ Dir.chdir(savedDir)
205
+ end
206
+
207
+ def remove_obsolete_symlinks
208
+ @docs.each do
209
+ |docDir|
210
+ Dir.chdir(File.join(@rootDir, docDir))
211
+ project = File.basename(File.dirname(docDir))
212
+ tries = [project, project.capitalize, project.sub('.feature', ''), project.sub('.feature', '').capitalize]
213
+ files = []
214
+ tries.each{|try| files << try if File.symlink?(try) }
215
+ files.compact.each do
216
+ |symlink|
217
+ if symlink and File.symlink?(symlink)
218
+ cmd = "rm #{symlink}"
219
+ @actions << cmd
220
+ FileUtils.rm_f(symlink, :verbose => true)
221
+ run_git_cmd("git rm -f --ignore-unmatch #{symlink}") if @add_changes_to_git
222
+ end
223
+ end
224
+ end
225
+ end
226
+
227
+ def remove_files_with_case_sensitive_changes(file_correct_case)
228
+ files = Dir.glob(file_correct_case + '*', File::FNM_CASEFOLD)
229
+ return if files.size == 1
230
+ files.each{
231
+ |file|
232
+ next if File.basename(file).eql?(File.basename(file_correct_case))
233
+ if @add_changes_to_git
234
+ run_git_cmd("git rm -f #{file}")
235
+ else
236
+ FileUtils.rm_f(file)
237
+ end
238
+ }
239
+ end
240
+
241
+ def run_git_cmd(git_cmd)
242
+ return unless @add_changes_to_git
243
+ res = system(git_cmd)
244
+ unless res
245
+ binding.pry
246
+ raise "Running #{git_cmd} failed"
247
+ end
248
+ @actions << git_cmd
249
+ end
250
+
251
+ def execute_cleanup(add_changes_to_git=false)
252
+ @add_changes_to_git = add_changes_to_git
253
+ @actions ||= []
254
+ savedDir = Dir.pwd
255
+ remove_obsolete_symlinks
256
+ Dir.chdir(@rootDir)
257
+ cmds = []
258
+ @new_best_name.each{
259
+ |picture|
260
+ dir_name = File.dirname(picture[:path])
261
+ Dir.chdir(File.join(@rootDir, dir_name))
262
+ Dir.glob("*#{extension}").each do
263
+ |wiki_file|
264
+ old_image_name = picture[:name]
265
+ new_image_name = picture[:best_name]
266
+ if old_image_name.index('-')
267
+ puts "Skipping mv #{old_image_name} #{new_image_name}"
268
+ next
269
+ end
270
+ cmd = "change_image_name_in_mediawiki #{wiki_file} #{picture[:name]} #{picture[:best_name]}"
271
+ # cmd = 'change_image_name_in_mediawiki test.mediawiki ch.elexis.icpc_icpc1.png icpc1.png'
272
+ change_image_name_in_mediawiki wiki_file, old_image_name, new_image_name
273
+ @actions << cmd
274
+ oldFiles = Dir.glob(old_image_name, File::FNM_CASEFOLD)
275
+ oldFiles.each{ |old_file|
276
+ if @add_changes_to_git
277
+ run_git_cmd("git rm -f --ignore-unmatch #{old_file}") if File.exist?(old_file)
278
+ else
279
+ FileUtils.rm_f(old_file, :verbose => true)
280
+ @actions << "rm -f #{old_file}"
281
+ end
282
+ }
283
+ end
284
+ }
285
+ Dir.chdir(@rootDir)
286
+ # Add all pictures which were downloaded and still have the same name
287
+ @pictures.each { |picture| run_git_cmd("git add -f #{picture[:path]}") if File.exist?(picture[:path]) }
288
+ @actions.uniq!
289
+ puts @actions.join("\n")
290
+ ensure
291
+ Dir.chdir(savedDir)
292
+ end
293
+
294
+ # Helper for scripts
295
+ # We assume that the referenced new_image_name is living in the same directory
296
+ # as the mediawiki_file
297
+ def change_image_name_in_mediawiki(mediawiki_file, old_image_name, new_image_name)
298
+ if new_image_name.downcase != File.basename(new_image_name).downcase
299
+ raise "new_image_name #{new_image_name} may not contain a directory path"
300
+ end
301
+ if @add_changes_to_git
302
+ run_git_cmd("git add #{old_image_name} && git mv #{old_image_name} #{new_image_name}")
303
+ elsif @actions
304
+ @actions << "mv #{old_image_name} #{new_image_name}"
305
+ FileUtils.mv(old_image_name, new_image_name, :verbose => true)
306
+ end unless File.exists?(new_image_name)
307
+ puts "change_image_name_in_mediawiki #{Dir.pwd}/#{mediawiki_file}: #{old_image_name.inspect} => #{new_image_name.inspect}" # if $VERBOSE
308
+ newLines = []
309
+ lines = IO.readlines(mediawiki_file)
310
+ lines.each{
311
+ |line|
312
+ unless m = ImagePattern.match(line)
313
+ newLines << line
314
+ else
315
+ unless old_image_name.downcase.eql?(m[2].downcase) or /\/#{old_image_name}/i.match(m[2])
316
+ puts "change_image_name_in_mediawiki #{__LINE__} skip #{m}" if $VERBOSE
317
+ newLines << line
318
+ else
319
+ dirName = File.dirname(mediawiki_file)
320
+ simpleName = File.join(dirName, File.basename(new_image_name))
321
+ if files = Dir.glob(simpleName, File::FNM_CASEFOLD) and files.size >= 1
322
+ # if files = (Dir.glob(simpleName, File::FNM_CASEFOLD) +Dir.glob(old_image_name, File::FNM_CASEFOLD)) and files.size >= 1
323
+ new_line = line.sub(m[2], new_image_name)
324
+ puts "change_image_name_in_mediawiki #{__LINE__} #{line} aus #{m[2]} mit #{new_image_name}" if $VERBOSE
325
+ newLines << new_line
326
+ else
327
+ msg = "#{__LINE__} Could not find image for #{m[0]} searched for #{simpleName} in #{Dir.pwd}. files are #{files}"
328
+ raise msg
329
+ end
330
+ end
331
+ end
332
+ }
333
+ File.open(mediawiki_file, "w") {|f| f.write newLines.join.gsub(/\[\[Datei:|\[\[Image:/i, '[[File:')}
334
+ run_git_cmd("git add #{mediawiki_file}")
335
+ end
336
+ end
337
+ end
338
+ end