| rev | line source | 
| bsw@2 | 1 local old_draft_id = param.get("old_draft_id", atom.integer) | 
| bsw@2 | 2 local new_draft_id = param.get("new_draft_id", atom.integer) | 
| bsw@1045 | 3 local initiative_id = param.get("initiative_id", atom.number) | 
| bsw@2 | 4 | 
| bsw@1045 | 5 if not old_draft_id | 
| bsw@1045 | 6   or not new_draft_id | 
| bsw@1045 | 7   or old_draft_id == new_draft_id | 
| bsw@1045 | 8 then | 
| bsw@1045 | 9   slot.reset_all() | 
| bsw@1045 | 10   slot.select("error", function() | 
| bsw@1045 | 11     ui.tag{ content = _"Please choose two different versions of the draft to compare" } | 
| bsw@1045 | 12   end ) | 
| bsw@1045 | 13   request.redirect{ | 
| bsw@1045 | 14     module = "draft", view = "list", params = { | 
| bsw@1045 | 15       initiative_id = initiative_id | 
| bsw@1045 | 16     } | 
| bsw@1045 | 17   } | 
| bsw@10 | 18   return | 
| bsw@10 | 19 end | 
| bsw@10 | 20 | 
| bsw@2 | 21 if old_draft_id > new_draft_id then | 
| jbe@1226 | 22   old_draft_id, new_draft_id = new_draft_id, old_draft_id | 
| bsw@2 | 23 end | 
| bsw@2 | 24 | 
| bsw@2 | 25 local old_draft = Draft:by_id(old_draft_id) | 
| bsw@2 | 26 local new_draft = Draft:by_id(new_draft_id) | 
| bsw@2 | 27 | 
| bsw@1045 | 28 local initiative = new_draft.initiative | 
| bsw@1045 | 29 | 
| bsw@1045 | 30 if app.session.member then | 
| bsw@1045 | 31   initiative:load_everything_for_member_id(app.session.member_id) | 
| bsw@1045 | 32   initiative.issue:load_everything_for_member_id(app.session.member_id) | 
| bsw@1045 | 33 end | 
| bsw@1045 | 34 | 
| bsw@1045 | 35 | 
| bsw@1045 | 36 execute.view{ module = "issue", view = "_sidebar_state", params = { | 
| bsw@1045 | 37   initiative = initiative | 
| bsw@1045 | 38 } } | 
| bsw@1045 | 39 | 
| bsw@1045 | 40 execute.view { | 
| bsw@1045 | 41   module = "issue", view = "_sidebar_issue", | 
| bsw@1045 | 42   params = { | 
| bsw@1045 | 43     issue = initiative.issue, | 
| bsw@1045 | 44     highlight_initiative_id = initiative.id | 
| bsw@1045 | 45   } | 
| poelzi@160 | 46 } | 
| poelzi@159 | 47 | 
| bsw@1045 | 48 execute.view { | 
| bsw@1045 | 49   module = "issue", view = "_sidebar_whatcanido", | 
| bsw@1045 | 50   params = { initiative = initiative } | 
| bsw@1045 | 51 } | 
| poelzi@159 | 52 | 
| bsw@1045 | 53 execute.view { | 
| bsw@1045 | 54   module = "issue", view = "_sidebar_members", params = { | 
| bsw@1045 | 55     issue = initiative.issue, initiative = initiative | 
| bsw@1045 | 56   } | 
| bsw@1045 | 57 } | 
| bsw@1045 | 58 | 
| bsw@1045 | 59 | 
| bsw@1045 | 60 | 
| bsw@1045 | 61 execute.view { | 
| bsw@1045 | 62   module = "issue", view = "_head", params = { | 
| bsw@1045 | 63     issue = initiative.issue | 
| bsw@1045 | 64   } | 
| bsw@1045 | 65 } | 
| bsw@1045 | 66 | 
| bsw@1045 | 67 | 
| poelzi@159 | 68 | 
| bsw@95 | 69 local old_draft_content = string.gsub(string.gsub(old_draft.content, "\n", " ###ENTER###\n"), " ", "\n") | 
| bsw@95 | 70 local new_draft_content = string.gsub(string.gsub(new_draft.content, "\n", " ###ENTER###\n"), " ", "\n") | 
| bsw@95 | 71 | 
| jbe@1226 | 72 local key = multirand.string(24, "0123456789abcdefghijklmnopqrstuvwxyz") | 
| bsw@2 | 73 | 
| bsw@1230 | 74 local old_draft_filename = encode.file_path(WEBMCP_BASE_PATH, 'tmp', "diff-" .. key .. "-old.tmp") | 
| bsw@1230 | 75 local new_draft_filename = encode.file_path(WEBMCP_BASE_PATH, 'tmp', "diff-" .. key .. "-new.tmp") | 
| bsw@2 | 76 | 
| bsw@2 | 77 local old_draft_file = assert(io.open(old_draft_filename, "w")) | 
| bsw@95 | 78 old_draft_file:write(old_draft_content) | 
| bsw@2 | 79 old_draft_file:write("\n") | 
| bsw@2 | 80 old_draft_file:close() | 
| bsw@2 | 81 | 
| bsw@2 | 82 local new_draft_file = assert(io.open(new_draft_filename, "w")) | 
| bsw@95 | 83 new_draft_file:write(new_draft_content) | 
| bsw@2 | 84 new_draft_file:write("\n") | 
| bsw@2 | 85 new_draft_file:close() | 
| bsw@2 | 86 | 
| bsw@728 | 87 local output, err, status = extos.pfilter(nil, "sh", "-c", "diff -U 1000000000 '" .. old_draft_filename .. "' '" .. new_draft_filename .. "' | grep -v ^--- | grep -v ^+++ | grep -v ^@") | 
| bsw@2 | 88 | 
| bsw@2 | 89 os.remove(old_draft_filename) | 
| bsw@2 | 90 os.remove(new_draft_filename) | 
| bsw@2 | 91 | 
| bsw@95 | 92 local last_state = "first_run" | 
| bsw@95 | 93 | 
| bsw@95 | 94 local function process_line(line) | 
| bsw@95 | 95   local state_char = string.sub(line, 1, 1) | 
| bsw@95 | 96   local state | 
| bsw@95 | 97   if state_char == "+" then | 
| bsw@95 | 98     state = "added" | 
| bsw@95 | 99   elseif state_char == "-" then | 
| bsw@95 | 100     state = "removed" | 
| bsw@95 | 101   elseif state_char == " " then | 
| bsw@95 | 102     state = "unchanged" | 
| bsw@95 | 103   end | 
| bsw@95 | 104   local state_changed = false | 
| bsw@95 | 105   if state ~= last_state then | 
| bsw@95 | 106     if last_state ~= "first_run" then | 
| bsw@95 | 107       slot.put("</span> ") | 
| bsw@95 | 108     end | 
| bsw@95 | 109     last_state = state | 
| bsw@95 | 110     state_changed = true | 
| bsw@95 | 111     slot.put("<span class=\"diff_" .. tostring(state) .. "\">") | 
| bsw@95 | 112   end | 
| bsw@95 | 113 | 
| bsw@95 | 114   line = string.sub(line, 2, #line) | 
| bsw@95 | 115   if line ~= "###ENTER###" then | 
| bsw@95 | 116     if not state_changed then | 
| bsw@95 | 117       slot.put(" ") | 
| bsw@95 | 118     end | 
| bsw@953 | 119     slot.put(encode.html(line)) | 
| bsw@95 | 120   else | 
| bsw@95 | 121     slot.put("<br />") | 
| bsw@95 | 122   end | 
| bsw@95 | 123 end | 
| bsw@95 | 124 | 
| bsw@1045 | 125 ui.section( function() | 
| bsw@1045 | 126   ui.sectionHead( function() | 
| bsw@1045 | 127     ui.link{ | 
| bsw@1045 | 128       module = "initiative", view = "show", id = initiative.id, | 
| bsw@1045 | 129       content = function () | 
| bsw@1045 | 130         ui.heading { | 
| bsw@1045 | 131           level = 1, | 
| bsw@1045 | 132           content = initiative.display_name | 
| bsw@1045 | 133         } | 
| bsw@1045 | 134       end | 
| bsw@1045 | 135     } | 
| bsw@1045 | 136     ui.heading{ level = 2, content = _("Comparision of revisions #{id1} and #{id2}", { | 
| bsw@1045 | 137       id1 = old_draft.id, | 
| bsw@1045 | 138       id2 = new_draft.id | 
| bsw@1045 | 139     } ) } | 
| bsw@1045 | 140   end ) | 
| bsw@1045 | 141 | 
| bsw@1045 | 142   if app.session.member_id and not new_draft.initiative.revoked then | 
| bsw@1045 | 143     local supporter = app.session.member:get_reference_selector("supporters") | 
| bsw@1045 | 144       :add_where{ "initiative_id = ?", new_draft.initiative_id } | 
| bsw@1045 | 145       :optional_object_mode() | 
| bsw@1045 | 146       :exec() | 
| bsw@1045 | 147     if supporter and supporter.draft_id ~= new_draft.id then | 
| bsw@1045 | 148       ui.sectionRow("draft_updated_info", function() | 
| bsw@1045 | 149         ui.container{ | 
| bsw@1045 | 150           attr = { class = "info" }, | 
| bsw@1045 | 151           content = _"The draft of this initiative has been updated!" | 
| bsw@1045 | 152         } | 
| bsw@1045 | 153         slot.put(" ") | 
| bsw@1045 | 154         ui.link{ | 
| bsw@1045 | 155           text   = _"refresh my support", | 
| bsw@1045 | 156           module = "initiative", | 
| bsw@1045 | 157           action = "add_support", | 
| bsw@1045 | 158           id     = new_draft.initiative.id, | 
| bsw@1045 | 159           params = { draft_id = new_draft.id }, | 
| bsw@1045 | 160           routing = { | 
| bsw@1045 | 161             default = { | 
| bsw@1045 | 162               mode = "redirect", | 
| bsw@1045 | 163               module = "initiative", | 
| bsw@1045 | 164               view = "show", | 
| bsw@1045 | 165               id = new_draft.initiative.id | 
| bsw@1045 | 166             } | 
| bsw@1045 | 167           } | 
| bsw@1045 | 168         } | 
| bsw@1045 | 169 | 
| bsw@1045 | 170         slot.put(" · ") | 
| bsw@1045 | 171 | 
| bsw@1045 | 172         ui.link{ | 
| bsw@1045 | 173           text   = _"remove my support", | 
| bsw@1045 | 174           module = "initiative", | 
| bsw@1045 | 175           action = "remove_support", | 
| bsw@1045 | 176           id     = new_draft.initiative.id, | 
| bsw@1045 | 177           routing = { | 
| bsw@1045 | 178             default = { | 
| bsw@1045 | 179               mode = "redirect", | 
| bsw@1045 | 180               module = "initiative", | 
| bsw@1045 | 181               view = "show", | 
| bsw@1045 | 182               id = new_draft.initiative.id | 
| bsw@1045 | 183             } | 
| bsw@1045 | 184           } | 
| bsw@1045 | 185         } | 
| bsw@1045 | 186 | 
| bsw@1045 | 187       end ) | 
| bsw@2 | 188     end | 
| bsw@1045 | 189   end | 
| bsw@1045 | 190 | 
| bsw@1045 | 191   ui.sectionRow( function() | 
| bsw@2 | 192 | 
| bsw@1045 | 193     if not status then | 
| bsw@1045 | 194       ui.field.text{ value = _"The drafts do not differ" } | 
| bsw@1045 | 195     else | 
| bsw@1045 | 196       ui.container{ | 
| bsw@1045 | 197         tag = "div", | 
| bsw@1045 | 198         attr = { class = "diff" }, | 
| bsw@1045 | 199         content = function() | 
| bsw@1045 | 200           output = output:gsub("[^\n\r]+", function(line) | 
| bsw@1045 | 201             process_line(line) | 
| bsw@1045 | 202           end) | 
| bsw@1045 | 203         end | 
| bsw@1045 | 204       } | 
| bsw@1045 | 205     end | 
| bsw@1045 | 206 | 
| bsw@1045 | 207   end ) | 
| jbe@1226 | 208 end ) |