Fixed wrong hours and minutes calculation


Added new command for back tracking

Added new command for back tracking

--- keymaps/atom-autocomplete-php.cson
+++ keymaps/atom-autocomplete-php.cson
@@ -1,3 +1,4 @@
 'atom-text-editor':
   'ctrl-alt-n': 'atom-autocomplete-php:namespace'
   'f1': 'atom-autocomplete-php:goto'
+  'ctrl-shift-Z': 'atom-autocomplete-php:goto-backtrack'


Used seaweed alternate url for download clip from november17. (#1962)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


view added

view added

error: pathspec 'app/assets/javascripts/admin/views/task/task_create_view.coffee' did not match any file(s) known to git

--- app/assets/javascripts/admin/views/task/task_create_view.coffee
+++ app/assets/javascripts/admin/views/task/task_create_view.coffee
@@ -0,0 +1,13 @@
+### define
+underscore : _
+backbone.marionette : marionette
+routes : routes
+###
+
+class TaskCreateView extends Backbone.Marionette.LayoutView
+
+  id : "task-create"
+  className : "container wide"
+  template : _.template("""
+
+  """)


Use recursinve frame reading (instead of time interval) from video feed to try and hit max frames per second.

error: pathspec 'examples/coffeescript/camera-face-detect-max-frames.coffee' did not match any file(s) known to git

--- examples/coffeescript/camera-face-detect-max-frames.coffee
+++ examples/coffeescript/camera-face-detect-max-frames.coffee
@@ -0,0 +1,56 @@
+cv = require 'opencv'
+
+# First we create a new VideoCapture object to get
+# video from the camera (0 for default camera)
+camera = new cv.VideoCapture(1)
+
+# we create a window to display the Video frames
+namedWindow = new cv.NamedWindow('Video', 0)
+color = [255,0,0]
+
+frameRead = () ->
+  # camera.read allows us to retrieve the current
+  # frame to be displayed in the video window.
+  camera.read((err, im) ->
+    # We can check for errors and even break the
+    # program execution if an error is detected here.
+    console.log "The err ==>#{ err }" if err
+
+    # There is no need to display the image width or Height
+    # but I leave this here in case anyone needs to check them.
+    #console.log("Width: #{im.width()}")
+    #console.log("height: #{im.height()}")
+
+    # Before working with the frame we need to check the image
+    # is already available and has a width and height greater than 0,
+    # otherwise it will fail when trying to do namedWindow.show()
+    # and the image has width or height equal or less than 0.
+    if im.width() > 0 and im.height() > 0
+      #console.log("Interval ID => #{ intervalId }")
+      #console.log(intervalId)
+      clearInterval(intervalId) if intervalId?
+      im.detectObject('./haarcascades/haarcascade_frontalface_alt.xml', {}, (err, faces) ->
+        for face in faces
+          im.rectangle([face.x, face.y], [face.x + face.width, face.y + face.height], [0,255,0], 2)
+
+        # We use the previously created namedWindow to display the
+        # video frame to wich we applied the blur and filter.
+        namedWindow.show(im)
+
+        # Finally we get the key pressed on the window to terminate
+        # execution of the program.
+        res = namedWindow.blockingWaitKey(0, 20)
+
+        # In this case we terminate the program if any key is pressed.
+        #if res >= 0 then do not set a new timeout to get a new frame.
+        setTimeout(frameRead, 5) if res < 0
+      )
+
+  )
+
+# We set an interval to retrieve frames from the
+# video source and we get the intervalId so we can
+# stop the program by pressing any key on the video feed window.
+intervalId = setInterval(() ->
+  frameRead(intervalId)
+, 100)


Adding missing parens

Adding missing parens

--- src/packages/autocomplete/spec/autocomplete-spec.coffee
+++ src/packages/autocomplete/spec/autocomplete-spec.coffee
@@ -433,7 +433,7 @@
     editor.attachToDom()
     editor.insertText('thisIsAReallyReallyReallyLongCompletion ')
     editor.moveCursorToBottom()
-    editor.insertNewline
+    editor.insertNewline()
     editor.insertText('t')
     autocomplete.attach()
     expect(autocomplete.list.prop('scrollWidth')).toBe autocomplete.list.width()


Improve subscriptions

Improve subscriptions

--- packages/rocketchat-lib/server/models/Subscriptions.coffee
+++ packages/rocketchat-lib/server/models/Subscriptions.coffee
@@ -210,7 +210,7 @@

 		update =
 			$set:
-				'fname': name
+				fname: name

 		return @update query, update, { multi: true }


Group selectbox js

Group selectbox js

Signed-off-by: Dmitriy Zaporozhets <be23d75b156792e5acab51b196a2deb155d35d6a@gmail.com>

error: pathspec 'app/assets/javascripts/groups_select.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/groups_select.js.coffee
+++ app/assets/javascripts/groups_select.js.coffee
@@ -0,0 +1,41 @@
+class @GroupsSelect
+  constructor: ->
+    $('.ajax-groups-select').each (i, select) =>
+      skip_ldap = $(select).hasClass('skip_ldap')
+
+      $(select).select2
+        placeholder: "Search for a group"
+        multiple: $(select).hasClass('multiselect')
+        minimumInputLength: 0
+        query: (query) ->
+          Api.groups query.term, skip_ldap, (groups) ->
+            data = { results: groups }
+            query.callback(data)
+
+        initSelection: (element, callback) ->
+          id = $(element).val()
+          if id isnt ""
+            Api.group(id, callback)
+
+
+        formatResult: (args...) =>
+          @formatResult(args...)
+        formatSelection: (args...) =>
+          @formatSelection(args...)
+        dropdownCssClass: "ajax-groups-dropdown"
+        escapeMarkup: (m) -> # we do not want to escape markup since we are displaying html in results
+          m
+
+  formatResult: (group) ->
+    if group.avatar_url
+      avatar = group.avatar_url
+    else
+      avatar = gon.default_avatar_url
+
+    "

+
#{group.name}

+
#{group.path}

+
"
+
+  formatSelection: (group) ->
+    group.name


Created monkey patch for Collection#fetch

This fetch now triggers a before:fetch event, on which we can bind cool
stuff (like loading indicators)

error: pathspec 'core/app/backbone/contrib/monkey_collection_fetch.coffee' did not match any file(s) known to git

--- core/app/backbone/contrib/monkey_collection_fetch.coffee
+++ core/app/backbone/contrib/monkey_collection_fetch.coffee
@@ -0,0 +1,5 @@
+oldCollectionFetch = Backbone.Collection.prototype.fetch
+
+Backbone.Collection.prototype.fetch = (options) ->
+  @trigger("before:fetch")
+  oldCollectionFetch.call this, options


sidebar/stacktemplates: add share with team and make private menu items

--- client/app/lib/components/sidebar/index.coffee
+++ client/app/lib/components/sidebar/index.coffee
@@ -20,6 +20,9 @@
 DEFAULT_LOGOPATH = '/a/images/logos/sidebar_footer_logo.svg'
 MENU = null
 isAdmin = require 'app/util/isAdmin'
+remote = require 'app/remote'
+whoami = require 'app/util/whoami'
+
 canCreateStacks = require 'app/util/canCreateStacks'

 require './styl/sidebar.styl'
@@ -93,7 +96,7 @@

     draft = @state.drafts.get id
     switch title
-      when 'Edit' then router.handleRoute "/Stack-Editor/#{id}"
+      when 'Edit', 'View Stack' then router.handleRoute "/Stack-Editor/#{id}"
       when 'Initialize'
         EnvironmentFlux.actions.generateStack(id).then ({ template }) ->
           appManager.tell 'Stackeditor', 'reloadEditor', template._id
@@ -106,6 +109,10 @@
         computeController.makeTeamDefault draft.toJS(), yes
       when 'Delete'
         computeController.deleteStackTemplate draft.toJS(), yes
+      when 'Share With Team'
+        computeController.sharingStackTemplate draft.get('_id'), 'group'
+      when 'Make Private'
+        computeController.sharingStackTemplate draft.get('_id'), 'private'

@@ -124,10 +131,21 @@

     if draft.getIn ['config', 'remoteDetails', 'originalUrl']
       menuItems['Open on GitLab'] = { callback }
-
-    ['Edit', 'Initialize'].forEach (name) => menuItems[name] = { callback }
+    if whoami()._id is draft.get 'originId'
+      menuItems['Edit'] = { callback }
+    else
+      menuItems['View Stack'] = { callback }
+
+    menuItems['Initialize'] = { callback }
     menuItems['Clone'] = { callback }  if canCreateStacks() or isAdmin()
-    menuItems['Make Team Default'] = { callback } if isAdmin() and draft.get('machines').size
+
+    if draft.get('machines').size
+      menuItems['Make Team Default'] = { callback } if isAdmin()
+      if whoami()._id is draft.get('originId')
+        if draft.get('accessLevel') is 'private'
+        then menuItems['Share With Team'] = { callback }
+        else  menuItems['Make Private'] = { callback }
+
     menuItems['Delete'] = { callback }

     { top } = findDOMNode(@refs["draft-#{id}"]).getBoundingClientRect()


sidebar: add getter allStackTemplates to get stack template

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Bug fixes & IE polyfills.

Bug fixes & IE polyfills.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lonelyplanet/rizzo.git/'


Disable typeahead for now

Disable typeahead for now

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/startae/hub.git/'


Remove accidentally duplicated line.

Remove accidentally duplicated line.

:facepalm:

--- app/assets/javascripts/awards_handler.coffee
+++ app/assets/javascripts/awards_handler.coffee
@@ -196,7 +196,6 @@
     origTitle  = @getAwardTooltip awardBlock
     users      = []

-    if origTitle
     if origTitle
       users = origTitle.trim().split(', ')


Pass dropdown instance to toggleLabel callback

--- app/assets/javascripts/gl_dropdown.js.coffee
+++ app/assets/javascripts/gl_dropdown.js.coffee
@@ -454,7 +454,7 @@

       # Toggle the dropdown label
       if @options.toggleLabel
-        @updateLabel()
+        @updateLabel(selectedObject, el, @)
       else
         selectedObject
     else if el.hasClass(INDETERMINATE_CLASS)
@@ -481,7 +481,7 @@

       # Toggle the dropdown label
       if @options.toggleLabel
-        @updateLabel(selectedObject, el)
+        @updateLabel(selectedObject, el, @)
       if value?
         if !field.length and fieldName
           @addInput(fieldName, value)
@@ -580,8 +580,8 @@
       # Scroll the dropdown content up
       $dropdownContent.scrollTop(listItemTop - dropdownContentTop)

-  updateLabel: (selected = null, el = null) =>
-    $(@el).find(".dropdown-toggle-text").text @options.toggleLabel(selected, el)
+  updateLabel: (selected = null, el = null, instance = null) =>
+    $(@el).find(".dropdown-toggle-text").text @options.toggleLabel(selected, el, instance)

 $.fn.glDropdown = (opts) ->
   return @.each ->


use rails_admin.dom_ready event instead of document.ready

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/patleb/admineer.git/'


Print unescaped job name and consistently order listing

--- src/jenkins.coffee
+++ src/jenkins.coffee
@@ -41,7 +41,8 @@

 jenkinsBuild = (msg, buildWithEmptyParameters) ->
     url = process.env.HUBOT_JENKINS_URL
-    job = querystring.escape msg.match[1]
+    unescapedJob = msg.match[1]
+    job = querystring.escape unescapedJob
     params = msg.match[3]
     command = if buildWithEmptyParameters then "buildWithParameters" else "build"
     path = if params then "#{url}/job/#{job}/buildWithParameters?#{params}" else "#{url}/job/#{job}/#{command}"
@@ -57,7 +58,7 @@
         if err
           msg.reply "Jenkins says: #{err}"
         else if 200 <= res.statusCode < 400 # Or, not an error code.
-          msg.reply "(#{res.statusCode}) Build started for #{job} #{url}/job/#{job}"
+          msg.reply "(#{res.statusCode}) Build started for #{unescapedJob} #{url}/job/#{job}"
         else if 400 == res.statusCode
           jenkinsBuild(msg, true)
         else
@@ -188,13 +189,15 @@
         else
           try
             content = JSON.parse(body)
-            for job in content.jobs
-              # Add the job to the jobList
-              index = jobList.indexOf(job.name)
-              if index == -1
-                jobList.push(job.name)
-                index = jobList.indexOf(job.name)
-
+            for jobFromServer in content.jobs
+              # Add new jobs to the jobList
+              jobList.push(jobFromServer.name) if jobList.indexOf(jobFromServer.name) is -1
+
+            content.jobs.sort (a, b) ->
+              aIndex = jobList.indexOf a.name
+              bIndex = jobList.indexOf b.name
+              aIndex - bIndex
+            .forEach (job, index) ->
               state = if job.color == "red" then "FAIL" else "PASS"
               if filter.test job.name
                 response += "[#{index + 1}] #{state} #{job.name}\n"


Refactored creation process It is step-by-step based now (i.e. doesn't rely on a single command)

--- src/memegen.coffee
+++ src/memegen.coffee
@@ -6,7 +6,8 @@
 #
 # Commands:
 #   hubot list - Returns available meme templates from Memegen.link and their respective URLs (keys)
-#   hubot <template> --top <text> --bottom <text> - Creates a <template> meme using <text> and returns links to it
+#   hubot meme create - Starts meme creation process
+#   hubot meme cancel - Cancels the meme creation process
 #
 # Notes:
 #   None
@@ -17,39 +18,86 @@
 MEMEGEN_API_URL = "http://memegen.link"

 module.exports = (robot) ->
-    _templateCache = null
+    _templateKeysCache = []
+    _templateListCache = null

-    robot.respond /meme list/i, (res) ->
-        return res.send(_templateCache) if _templateCache?
-        GetMGResult res, "/templates/", null, (obj) ->
-            _templateCache = ""
-            for template, url of obj
-                key = url.split "/"
-                key = key[key.length - 1]
-                _templateCache += "#{template} | Key: #{key} | Example: http://memegen.link/#{key}/hello/world.jpg\n"
-            # TODO: Paste results?
-            res.send _templateCache
+    # Delete if takes too long?
+    _pending = []

-    robot.respond /meme (.+) --top (.+) --bottom (.+)/i, (res) ->
-        template = res.match[1]
-        topText = _spaceToHyphen(res.match[2])
-        bottomText = _spaceToHyphen(res.match[3])
+    _mgAPI = (res, api, params = {}, handler) ->
+        res.http("#{MEMEGEN_API_URL}#{api}")
+            .query(params)
+            .get() (err, httpRes, body) ->
+                # TODO: Improve error handling
+                if err or (httpRes.statusCode isnt 200 and httpRes.statusCode isnt 302)
+                    res.reply "I'm unable to process your request at this time due to a server error. Please try again later."
+                    return res.robot.logger.error "hubot-memegen-link: #{body} (#{err})"

-        GetMGResult res, "/#{template}/#{topText}/#{bottomText}", null, (obj) ->
-            links = "Visible: #{obj.direct.visible}\n"
-            links += "Masked: #{obj.direct.masked}"
-            res.send links
+                try
+                    handler JSON.parse(body)
+                catch e
+                    res.robot.logger.error "hubot-memegen-link: #{e}"

-_spaceToHyphen = (str) ->
-    str.replace(/\s+/g, '-').toLowerCase()
+    # Fetch "pending" meme using user object
+    _getPending = (user) ->
+        for meme, index in _pending
+            return [index, meme] if meme[0].id is user.id
+        return false

-GetMGResult = (res, api, params = {}, handler) ->
-    res.http("#{MEMEGEN_API_URL}#{api}")
-        .query(params)
-        .get() (err, httpRes, body) ->
-            # TODO: Improve error handling
-            if err or (httpRes.statusCode isnt 200 and httpRes.statusCode isnt 302)
-                res.reply "I'm unable to process your request at this time due to a server error. Please try again later."
-                return res.robot.logger.error "hubot-memegen: #{body} (#{err})"
+    _templateExist = (template) ->
+        return true for key in _templateKeysCache when key is template

-            handler JSON.parse(body)+    _spaceToHyphen = (str) ->
+        str.replace(/\s+/g, '-').toLowerCase()
+
+    robot.respond /meme create/i, (res) ->
+        return if _getPending(res.message.user)
+        createMsg = "(1/3) Creating a meme. What template should I use (reply with the key)?"
+
+        if _templateListCache?
+            res.send(_templateListCache)
+            res.reply createMsg
+        else
+            _mgAPI res, "/templates/", null, (obj) ->
+                _templateListCache = ""
+                for template, url of obj
+                    key = url.split "/"
+                    key = key[key.length - 1]
+                    _templateKeysCache.push key
+                    _templateListCache += "#{template} | Key: #{key} | Example: http://memegen.link/#{key}/hello/world.jpg\n"
+                # TODO: Paste results (Pastebin)?
+                res.send _templateListCache
+                res.reply createMsg
+
+        _pending.push [res.message.user, false, false, false]
+        res.message.done = true
+
+    robot.respond /meme cancel/i, (res) ->
+        if [index, userMeme] = _getPending(res.message.user)
+            _pending.splice index, 1
+            res.reply "Your meme operation has been cancelled."
+        else
+            res.reply "You have no meme pending creation."
+        res.message.done = true
+
+    robot.hear /(.+)/i, (res) ->
+        return if _pending.length is 0
+        input = res.match[1]
+
+        # Dirty solution for now
+        if [index, userMeme] = _getPending(res.message.user)
+            if not userMeme[1]
+                if _templateExist(input)
+                    _pending[index][1] = input
+                    res.reply "(2/3) What should the top text be?"
+                else
+                    res.reply "(2/3) I'm sorry. There doesn't seem to be a meme associated with the key you have provided ('#{input}')."
+            else if not userMeme[2]
+                _pending[index][2] = input
+                res.reply "(3/3) What should the bottom text be?"
+            else if not userMeme[3]
+                _mgAPI res, "/#{_pending[index][1]}/#{_spaceToHyphen(_pending[index][2])}/#{_spaceToHyphen(input)}", null, (obj) ->
+                    _pending.splice index, 1
+                    links = "Visible: #{obj.direct.visible}\n"
+                    links += "Masked: #{obj.direct.masked}"
+                    res.send links


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

--- src/metered.coffee
+++ src/metered.coffee
@@ -10,7 +10,7 @@
 enemy = GameObject
   health: 500

-player.
+player.meter()
 # => Uncaught TypeError: Object has no method 'position'

 player.include(Bounded)


Modified in browser at pixie.strd6.com

Modified in browser at pixie.strd6.com

--- src/metered.coffee
+++ src/metered.coffee
@@ -1,6 +1,6 @@
 ###*
 The Metered module provides a simple drop-in
-meter ui to track arbitrary numeric at
+meter ui to track arbitrary numeric attributes

 player = Core


Added a thing which highlights the guide every 5 minutes until clicked. Fixed #11.

--- app/views/play/level/control_bar_view.coffee
+++ app/views/play/level/control_bar_view.coffee
@@ -24,7 +24,7 @@
     'click #restart-button': ->
       window.tracker?.trackEvent 'Clicked Restart', level: @worldName, label: @worldName
       @showRestartModal()
-
+
     'click #next-game-button': ->
       Backbone.Mediator.publish 'next-game-pressed'

@@ -64,9 +64,23 @@
       c.homeLink = "/play/ladder/" + levelID
     c

+  afterRender: ->
+    super()
+    @guideHighlightInterval ?= setInterval @onGuideHighlight, 5 * 60 * 1000
+
+  destroy: ->
+    clearInterval @guideHighlightInterval if @guideHighlightInterval
+    super()
+
+  onGuideHighlight: =>
+    return if @destroyed or @guideShownOnce
+    @$el.find('#docs-button').hide().show('highlight', 4000)
+
   showGuideModal: ->
     options = {docs: @level.get('documentation'), supermodel: @supermodel}
     @openModalView(new DocsModal(options))
+    clearInterval @guideHighlightInterval
+    @guideHighlightInterval = null

   showMultiplayerModal: ->
     @openModalView(new MultiplayerModal(session: @session, playableTeams: @playableTeams, level: @level, ladderGame: @ladderGame))


Unset key to undefined.

Unset key to undefined.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/RobotSnacks/stout-orm.git/'


this is where you make reload work

this is where you make reload work

--- src/require.coffee
+++ src/require.coffee
@@ -1,5 +1,5 @@
-#resourcePath = OSX.NSBundle.mainBundle.resourcePath
-resourcePath = "/Users/corey/code/mine/Atomicity"
+resourcePath = OSX.NSBundle.mainBundle.resourcePath
+#resourcePath = "/Users/corey/code/mine/Atomicity"

 paths = [
   "#{resourcePath}/src"


failing test for updates

failing test for updates

error: pathspec 'test/unit/test_blockquoted_updates.coffee' did not match any file(s) known to git

--- test/unit/test_blockquoted_updates.coffee
+++ test/unit/test_blockquoted_updates.coffee
@@ -0,0 +1,85 @@
+#= require task_list
+
+module "Blockquoted TaskList updates",
+  setup: ->
+    @blockquote = $ '<blockquote>'
+
+    @container = $ '<div>', class: 'js-task-list-container'
+
+    @list = $ '<ul>', class: 'task-list'
+
+    @completeItem = $ '<li>', class: 'task-list-item'
+    @completeCheckbox = $ '<input>',
+      type: 'checkbox'
+      class: 'task-list-item-checkbox'
+      disabled: true
+      checked: true
+
+    @incompleteItem = $ '<li>', class: 'task-list-item'
+    @incompleteCheckbox = $ '<input>',
+      type: 'checkbox'
+      class: 'task-list-item-checkbox'
+      disabled: true
+      checked: false
+
+    @field = $ '<textarea>', class: 'js-task-list-field', text: """
+      > - [x] complete
+      > - [ ] incomplete
+    """
+
+    @changes =
+      toComplete: """
+      > - [ ] complete
+      > - [ ] incomplete
+      """
+      toIncomplete: """
+      > - [x] complete
+      > - [x] incomplete
+      """
+
+    @completeItem.append @completeCheckbox
+    @list.append @completeItem
+    @completeItem.expectedIndex = 1
+
+    @incompleteItem.append @incompleteCheckbox
+    @list.append @incompleteItem
+    @incompleteItem.expectedIndex = 2
+
+    @container.append @list
+    @container.append @field
+
+    @blockquote.append @container
+
+    $('#qunit-fixture').append(@blockquote)
+    @container.taskList()
+
+  teardown: ->
+    $(document).off 'tasklist:changed'
+
+asyncTest "updates the source, marking the incomplete item as complete", ->
+  expect 3
+
+  @field.on 'tasklist:changed', (event, index, checked) =>
+    ok checked
+    equal index, @incompleteItem.expectedIndex
+    equal @field.val(), @changes.toIncomplete
+
+  setTimeout ->
+    start()
+  , 20
+
+  @incompleteCheckbox.click()
+
+asyncTest "updates the source, marking the complete item as incomplete", ->
+  expect 3
+
+  @field.on 'tasklist:changed', (event, index, checked) =>
+    ok !checked
+    equal index, @completeItem.expectedIndex
+    equal @field.val(), @changes.toComplete
+
+  setTimeout ->
+    start()
+  , 20
+
+  @completeCheckbox.click()


fix rental

fix rental

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ofoso/ofo.git/'


remove is hidden from any slides on load


- Create a new patch object from given diff

--- client/app/Applications/Shell.kdapplication/AppController.coffee
+++ client/app/Applications/Shell.kdapplication/AppController.coffee
@@ -44,7 +44,8 @@
       i = _lastMessageProcessed
       for diff in (item while (item = _orderedMessages[i++])?)
         # console.log "updating screen with:",diff
-        currentScreen = (@dmp.patch_apply diff,@lastScreen)[0]
+        patch = (@dmp.patch_fromText diff)
+        currentScreen = (@dmp.patch_apply patch,@lastScreen)[0]
         # currentScreen = diff
         @getView().updateScreen(currentScreen)
         @lastScreen = currentScreen


FastSpring payment notification listener

error: pathspec 'src/scripts/fastspring.coffee' did not match any file(s) known to git

--- src/scripts/fastspring.coffee
+++ src/scripts/fastspring.coffee
@@ -0,0 +1,51 @@
+# Description
+#   An HTTP listener for FastSpring payment notifications
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   HUBOT_FASTSPRING_PRIVATE_KEY
+#
+# Commands:
+#   None
+#
+# URLS:
+#   POST /hubot/fastspring
+#     room=<room>
+#     fullName=<customer's full name>
+#     email=<customer's email>
+#     productName=<product name, can also be an array of products>
+#     totalPriceValue=<total price value>
+#     totalPriceCurrency=<total price currency>
+#     url=<invoice's url>
+#
+# Notes:
+#   See FastSpring notifications overview for further details
+#   https://support.fastspring.com/entries/236490-Notifications-Overview
+#
+# Author:
+#   matteoagosti
+
+http = require "http"
+querystring = require "querystring"
+crypto = require "crypto"
+
+module.exports = (robot) ->
+  privateKey = process.env.HUBOT_FASTSPRING_PRIVATE_KEY
+
+  unless privateKey
+    robot.logger.error "Please set the HUBOT_FASTSPRING_PRIVATE_KEY environment variable."
+    return
+
+  robot.router.post "/hubot/fastspring", (req, res) ->
+    query = req.body
+    res.end
+
+    unless query.room
+      return
+
+    unless crypto.createHash("md5").update(query.security_data + privateKey, 'utf8').digest('hex') is query.security_hash
+      return
+
+    robot.messageRoom query.room, "#{query.fullName} (#{query.email}) just bought #{query.productName} for #{query.totalPriceValue}#{query.totalPriceCurrency}. #{query.url}"


Removed console.log.

Removed console.log.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bmedx/modulestore.git/'


Fix #8.

Fix #8.

--- client/helpers/envelopes.coffee
+++ client/helpers/envelopes.coffee
@@ -17,7 +17,10 @@
   Envelopes.find().fetch()

 Template.envelope.virtualAccount = ->
-  VirtualAccounts.findOne(this.virtualAccountId).name
+  virtualAccount = VirtualAccounts.findOne(this.virtualAccountId)
+  if virtualAccount
+    return virtualAccount.name
+  undefined

 Template.envelopeForm.events {
   'click .add-envelope': (event) ->


Add destroy method

Add destroy method

--- app/views/play/level/PlayGameDevLevelView.coffee
+++ app/views/play/level/PlayGameDevLevelView.coffee
@@ -80,3 +80,12 @@
     Backbone.Mediator.publish('playback:real-time-playback-started', {})
     Backbone.Mediator.publish('level:set-playing', {playing: true})
     @state.set('playing', true)
+
+  destroy: ->
+    @levelLoader?.destroy()
+    @surface?.destroy()
+    @god?.destroy()
+    @goalManager?.destroy()
+    @scriptManager?.destroy()
+    delete window.world # not sure where this is set, but this is one way to clean it up
+    super()


Special thanks to MaxCDN

Special thanks to MaxCDN

--- assets/javascripts/templates/pages/about_tmpl.coffee
+++ assets/javascripts/templates/pages/about_tmpl.coffee
@@ -30,7 +30,7 @@

Special thanks to:

-
Gauges for offering a free account to DevDocs
+
MaxCDN and Gauges for offering a free account to DevDocs

Heroku and New Relic for providing awesome free service

Daniel Bruce for the Entypo pictograms

Jeremy Kratz for the C/C++ logo


Actually fix the method name bug

Actually fix the method name bug

For real this time

--- src/pane-container-view.coffee
+++ src/pane-container-view.coffee
@@ -112,7 +112,7 @@
     @nearestPaneInDirection('right')?.focus()

   nearestPaneInDirection: (direction) ->
-    distance: (pointA, pointB) ->
+    distance = (pointA, pointB) ->
       x = pointB.x - pointA.x
       y = pointB.y - pointA.y
       Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2))


Append HomeView subviews in 1 operation

Append HomeView subviews in 1 operation

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/CodeforHawaii/projectmonitor.git/'


activity/flux: export module

activity/flux: export module


Teamwork: Added TeamworkInviteModal.

Teamwork: Added TeamworkInviteModal.

error: pathspec 'client/Teamwork/Views/teamworkinvitemodal.coffee' did not match any file(s) known to git

--- client/Teamwork/Views/teamworkinvitemodal.coffee
+++ client/Teamwork/Views/teamworkinvitemodal.coffee
@@ -0,0 +1,52 @@
+class TeamworkInviteModal extends KDModalView
+
+  constructor: (options = {}, data) ->
+
+    options.cssClass = "tw-modal tw-invite-modal"
+    options.title    = "Invite someone to your project"
+    options.content  = "
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor.
"
+    options.overlay  = yes
+    options.width    = 500
+    options.buttons  =
+      Invite         :
+        cssClass     : "modal-clean-green"
+        callback     : @bound "sendInvites"
+      Cancel         :
+        cssClass     : "modal-cancel"
+        callback     : @bound "destroy"
+
+    super options, data
+
+    @createInviteView()
+
+  createInviteView: ->
+    @completedItems = new KDView
+      cssClass : "completed-items"
+
+    @userController       = new KDAutoCompleteController
+      form                : new KDFormView
+      placeholder         : "Type a username to search "
+      name                : "userController"
+      itemClass           : MemberAutoCompleteItemView
+      itemDataPath        : "profile.nickname"
+      outputWrapper       : @completedItems
+      selectedItemClass   : MemberAutoCompletedItemView
+      listWrapperCssClass : "users"
+      submitValuesAsText  : yes
+      dataSource          : (args, callback) =>
+        {inputValue} = args
+        blacklist    = (data.getId() for data in @userController.getSelectedItemData())
+        blacklist.push KD.whoami()._id
+        KD.remote.api.JAccount.byRelevance inputValue, {blacklist}, (err, accounts) =>
+          callback accounts
+
+    @addSubView @userController.getView()
+    @addSubView @completedItems
+
+  sendInvites: ->
+    accounts  = @userController.getSelectedItemData()
+    usernames = []
+    usernames.push account.profile.nickname for account in accounts
+    @getDelegate().input.setValue "invite #{usernames.join ' '}"
+    @getDelegate().createMessage()
+    @destroy()


return error for unset parameters

return error for unset parameters


example application controller

example application controller

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/namineundorf/auraya.git/'


maintain the event log length at 60 items

--- src/packages/editor-stats/src/editor-stats-view.coffee
+++ src/packages/editor-stats/src/editor-stats-view.coffee
@@ -37,7 +37,11 @@

   track: =>
     date = new Date
-    @eventlog[time(date)] += 1
+    times = time date
+    @eventlog[times] ||= 0
+    @eventlog[times] += 1
+
+    @eventlog.shift() if @eventlog.length > 60
     console.log @eventlog

   toggle: ->


Show only server log times

Show only server log times

--- packages/rocketchat-lib/lib/callbacks.coffee
+++ packages/rocketchat-lib/lib/callbacks.coffee
@@ -6,8 +6,12 @@
 ###
 RocketChat.callbacks = {}

-RocketChat.callbacks.showTime = true
-RocketChat.callbacks.showTotalTime = true
+if Meteor.isServer
+	RocketChat.callbacks.showTime = true
+	RocketChat.callbacks.showTotalTime = true
+else
+	RocketChat.callbacks.showTime = false
+	RocketChat.callbacks.showTotalTime = false

 ###
 # Callback priorities
@@ -35,8 +39,8 @@
 		err = new Error
 		callback.stack = err.stack

-		if not id?
-			console.log('Callback without id', callback.stack)
+		# if not id?
+		# 	console.log('Callback without id', callback.stack)

 	# Avoid adding the same callback twice
 	for cb in RocketChat.callbacks[hook]


Initial commit

Initial commit

--- log.coffee
+++ log.coffee
@@ -0,0 +1,77 @@
+return unless window.console and window.console.log
+
+log = ->
+    args = []
+
+    makeArray(arguments).forEach (arg) ->
+        if typeof arg is 'string'
+            args = args.concat stringToArgs arg
+
+        else
+            args.push arg
+
+    _log.apply window, args
+
+_log = ->
+    console.log.apply console, makeArray(arguments)
+
+makeArray = (arrayLikeThing) ->
+    Array::slice.call arrayLikeThing
+
+formats = [{
+    # Italic
+    regex: /\*([^\*)]+)\*/
+    replacer: (m, p1) -> "%c#{p1}%c"
+    styles: -> ['font-style: italic', '']
+}, {
+    # Bold
+    regex: /\_([^\_)]+)\_/
+    replacer: (m, p1) -> "%c#{p1}%c"
+    styles: -> ['font-weight: bold', '']
+}, {
+    # Code
+    regex: /\`([^\`)]+)\`/
+    replacer: (m, p1) -> "%c#{p1}%c"
+    styles: -> ['background: rgb(255, 255, 219); padding: 1px 5px; border: 1px solid rgba(0, 0, 0, 0.1)', '']
+}, {
+    # Custom syntax: [c="color: red"]red[c]
+    regex: /\[c\=\"([^\")]+)\"\]([^\[)]+)\[c\]/
+    replacer: (m, p1, p2) -> "%c#{p2}%c"
+    styles: (match) -> [match[1], '']
+}]
+
+hasMatches = (str) ->
+    _hasMatches = false
+
+    formats.forEach (format) ->
+        if format.regex.test str
+            _hasMatches = true
+
+    return _hasMatches
+
+getOrderedMatches = (str) ->
+    matches = []
+
+    formats.forEach (format) ->
+        match = str.match format.regex
+        if match
+            matches.push
+                format: format
+                match: match
+
+    return matches.sort((a, b) -> a.match.index - b.match.index)
+
+stringToArgs = (str, args) ->
+    styles = []
+
+    while hasMatches str
+        matches = getOrderedMatches str
+        firstMatch = matches[0]
+        str = str.replace firstMatch.format.regex, firstMatch.format.replacer
+        styles = styles.concat firstMatch.format.styles(firstMatch.match)
+
+    [str].concat styles
+
+# Export
+window.log = log
+window.log.l = _log


changed watch yes to watch false in test

--- src/commands/test.coffee
+++ src/commands/test.coffee
@@ -139,5 +139,5 @@
       startMocha config, options, testFiles, globals

 module.exports = test = (options) ->
-  watcher = watch yes, options, ->
+  watcher = watch false, options, ->
     startBrunchTestRunner watcher.config, options


expose forbidden 403 to user

expose forbidden 403 to user

--- src/coffeescripts/SFDC.coffee
+++ src/coffeescripts/SFDC.coffee
@@ -416,8 +416,8 @@
       else if SFDC.isRequestLimitExceeded(err)
         Dialog.alert L.get("error"), L.get("error_request_limit_exceeded")
       else if SFDC.isForbidden(err)
-        LoggrUtil.log "Forbidden"
-        callback err, null
+        message = SFDC.getMessageFromError err
+        Dialog.alert err.statusText, message
     # 503
     else if SFDC.isServiceUnavailable(err)
       Dialog.alert L.get("error"), L.get("error_service_unavailable")


add recording mock

add recording mock

error: pathspec 'src/core/RecordingMock.coffee' did not match any file(s) known to git

--- src/core/RecordingMock.coffee
+++ src/core/RecordingMock.coffee
@@ -0,0 +1,10 @@
+module.exports = ()->
+
+  class RecordingMock
+
+    mockMethods:(methods)->
+      for methodName in methods
+        do(methodName) =>
+          @[methodName+"s"] = []
+          @[methodName] = (args...)=>
+            @[methodName+"s"].push(args)


spec for filter getById (angular)

spec for filter getById (angular)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/microweb10/forsale.git/'


adding custom handlebars conditional

adding custom handlebars conditional

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/wenchenglai/firehose-ember-shared.git/'


Parse out the score given into an int.

Parse out the score given into an int.


Set up mathjax_preprocessor

Set up mathjax_preprocessor


Renaming the UncaughtHandler to fix the typo

--- src/core/UncaughtHandler.coffee
+++ src/core/UncaughtHandler.coffee
@@ -1,6 +1,6 @@
 module.exports = (nodeProcess, Logger)->

-  new class UncaughtHlander
+  new class UncaughtHandler

     listen:()->
       nodeProcess.on 'uncaughtException', (err)->


Adds NewRelic model

Adds NewRelic model


create db provider

create db provider

error: pathspec 'app/scripts/providers/db.coffee' did not match any file(s) known to git

--- app/scripts/providers/db.coffee
+++ app/scripts/providers/db.coffee
@@ -0,0 +1,38 @@
+'use strict'
+
+###*
+ # @ngdoc function
+ # @name gummyApp.provider:$db
+ # @description
+ # # $db
+ # Internal DB provider
+###
+angular
+    .module 'gummyApp'
+    .service '$db', ($q) ->
+
+        # Imports
+        remote = require "remote"
+        app = remote.require "app"
+        Datastore = remote.require "nedb"
+
+
+        ###*
+         # Movies db
+         # @attribute movies
+        ###
+        @movies = new Datastore
+            filename: "#{app.getPath 'home'}/Gummy/movies.db"
+            autoload: true
+
+
+        ###*
+         # Settings db
+         #
+        ###
+        @settings = new Datastore
+            filename: "#{app.getPath 'home'}/Gummy/settings.db"
+            autoload: true
+
+
+        @


fix downvote

fix downvote

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/netguru/linkguru-web.git/'


model for invitation request (replacing launchrock, as a model. :)

error: pathspec 'server/app/bongo/models/invitationrequest.coffee' did not match any file(s) known to git

--- server/app/bongo/models/invitationrequest.coffee
+++ server/app/bongo/models/invitationrequest.coffee
@@ -0,0 +1,19 @@
+class JInvitationRequest extends bongo.Model
+  @set
+    schema          :
+      email         :
+        type        : String
+        email       : yes
+      sharedMethods :
+        static      : ['create']
+      requestedAt   :
+        type        : Date
+        default     : -> new Date
+
+  @create =(email, callback)->
+    invite = new @ {email}
+    invite.save (err)->
+      if err
+        callback err
+      else
+        callback null, email


Confirm Clan remove hero

Confirm Clan remove hero

--- app/views/clans/ClanDetailsView.coffee
+++ app/views/clans/ClanDetailsView.coffee
@@ -220,6 +220,7 @@
     @supermodel.addRequestResource( 'leave_clan', options).load()

   onRemoveMember: (e) ->
+    return unless window.confirm("Remove Hero?")
     if memberID = $(e.target).data('id')
       options =
         url: "/db/clan/#{@clanID}/remove/#{memberID}"


#506 Add Mappings model

#506 Add Mappings model

error: pathspec 'app/assets/javascripts/oxalis/model/binary/mappings.coffee' did not match any file(s) known to git

--- app/assets/javascripts/oxalis/model/binary/mappings.coffee
+++ app/assets/javascripts/oxalis/model/binary/mappings.coffee
@@ -0,0 +1,80 @@
+### define
+underscore : _
+jquery : $
+libs/request : Request
+###
+
+class Mappings
+
+  constructor : (datasetName, layer) ->
+
+    @mappings = _.indexBy(layer.mappings, "name")
+    @baseUrl = "/data/datasets/#{datasetName}/layers/#{layer.name}/mappings/"
+    @getParams = "?token=#{layer.token}"
+
+
+  getMappingArrayAsync : (mappingName) ->
+
+    @fetchMappings(mappingName)
+        .then => @getMappingArray(mappingName)
+
+
+  fetchMappings : (mappingName) ->
+
+    mappingChain = @getMappingChain(mappingName)
+    promises = _.map(mappingChain, (mappingName) => @fetchMapping(mappingName))
+    return $.when(promises...)
+
+
+  fetchMapping : (mappingName) ->
+
+    if @mappings[mappingName].mappingObject?
+      return $.Deferred.resolve().promise()
+
+    return Request.send(
+      url: @baseUrl + mappingName + @getParams
+      dataType: "json"
+    ).then (mapping) =>
+      @mappings[mappingName].mappingObject = mapping
+
+
+  getMappingArray : (mappingName) ->
+
+    mapping = @mappings[mappingName]
+    if mapping.mappingArray?
+      return mapping.mappingArray
+
+    return mapping.mappingArray = @buildMappingArray(mappingName)
+
+
+  buildMappingArray : (mappingName) ->
+
+    mappingArray = []
+
+    for currentMappingName in @getMappingChain(mappingName)
+
+      mappingObject = @mappings[currentMappingName].mappingObject
+      $.assert(mappingObject,
+          "mappingObject must have been fetched at this point")
+
+      for mappingClass in mappingObject.classes
+
+        minId = Math.min(mappingClass...)
+        mappedId = mappingArray[minId] || minId
+
+        for id in mappingClass
+          mappingArray[id] = mappedId
+
+    return mappingArray
+
+
+  getMappingChain : (mappingName) ->
+
+    chain = [mappingName]
+    mapping = @mappings[mappingName]
+
+    while mapping.parent?
+      chain.push(mapping.parent)
+      mapping = @mappings[mapping.parent]
+
+    return chain


added job watcher

added job watcher

error: pathspec 'src/serverjs/job_watcher.coffee' did not match any file(s) known to git

--- src/serverjs/job_watcher.coffee
+++ src/serverjs/job_watcher.coffee
@@ -0,0 +1,141 @@
+firebase = require './firebase_db'
+constants = require '../constants'
+Q = require 'q'
+
+class JobWatcher
+  constructor: (jobid) ->
+    @jobid = jobid
+    @urls = []
+    @status = "STARTING"
+    @queue = {}
+    @mapStatus = {}
+    @reduceStatus = {}
+    @initFromFirebase()
+
+
+  initFromFirebase: () ->
+    # keep it ALL in memory because reasons
+    @clientMap = {}
+    firebase.WORKER_STATUS_REF.once 'value', (snapshot) ->
+      snapshot.forEach (child) ->
+        @clientMap[child.name()] = child.val()
+    firebase.WORKER_STATUS_REF.on 'child_changed', (snapshot) =>
+      @clientMap[snapshot.name()] = snapshot.val()
+    firebase.WORKER_STATUS_REF.on 'child_removed', (snapshot) =>
+      delete @clientMap[snapshot.name()]
+
+    # get urls from firebase
+    firebase.JOB_STATUS_REF.child(@jobid).child('urls').once 'value', (snapshot) ->
+      snapshot.forEach (child) ->
+        @urls.push child.name()
+
+  get_active_clients: (num) ->
+    now = new Date().getTime()
+    active_clients = {}
+    for child_id, child of @clientMap
+      # Allow some time for RTT + delay
+      if now - child.last_update < 4 * constants.HEARTBEAT_INTERVAL
+        active_clients[child_id] = child
+      if active_clients.size == num
+        break
+    return active_clients
+
+  addMessage: (messageid, message) ->
+    @queue[messageid] = message
+
+  run: () ->
+    @loop()
+
+  loop: () ->
+
+    switch @status
+      when "STARTING"
+        @start()
+      when "MAPPING_STARTED"
+        @checkMappers()
+      when "MAPPING_ENDING_FIRST"
+        @allocateReducers()
+        @status = "MAPPING_ENDING"
+      when "MAPPING_ENDING"
+        @checkMappers
+      when "REDUCE_START"
+        # TODO init stuff
+        @status = "REDUCE_STARTED"
+      when "REDUCE_STARTED"
+        @checkMappers()  # so that if a reducer fails we have the data to send it?
+        @checkReducers()
+      else
+        # done
+
+    if @status is not "DONE"
+      setTimeout () =>
+        @loop()
+      , 1
+
+
+  start: () ->
+    @allocateMappers()
+    for child_id of @mappers
+      @send child_id, { name: 'MAP_START', job_id: @jobid, url: @mapStatus[child_id].url }
+
+  checkMappers: () ->
+    # read through messages to see if anyone finished, if all finished, or if anyone is dead
+
+    for message_id, message of @queue
+      if message.name is 'MAP_DONE'
+        node = message.worker_id
+        @mapStatus[node].done = true
+        @numMappersLeft--
+        delete @queue[message_id]
+        if @status is "MAPPING_STARTED"
+          @status = "MAPPING_ENDING_FIRST"
+
+    toRetry = []
+    for worker_id of @mappers
+      now = new Date().now()
+      if (now - @clientMap[worker_id].last_update > 4 * constants.HEARTBEAT_INTERVAL)
+        # he's dead jim
+        toRetry.push worker_id
+
+    for failed_worker in toRetry
+      @retryMap failed_worker
+
+    if @numMappersLeft == 0 and @status is not "REDUCE_STARTED"
+      @status = "REDUCE_START"
+
+  checkReducers: () ->
+
+  allocateMappers: () ->
+    numMappers = @urls.length
+    @mappers = @get_active_clients numMappers
+    index = 0
+    for child_id, child in @mappers
+      @mapStatus[child_id] = { done: false, url: @urls[index++] }
+    @numMappersLeft = numMappers
+
+  allocateReducers: () ->
+    numReducers = @urls.length
+    @reducers = @get_active_clients numReducers
+    for child_id of @reducers
+      @reduceStatus[child_id] = { done: false }
+    @numReducersLeft = numReducers
+
+  retryMap: (failed_id) ->
+    new_node = get_active_clients(1)[0]
+    url = @mapStatus[failed_id].url
+    @send new_node, { name: 'MAP_START', job_id: @jobid, url: url}
+    @mappers[new_node] = { done: false, url: url}
+    if @mapStatus[failed_id].done
+      @numMappersLeft++
+
+    delete @mappers[failed_id]
+
+
+  retryReduce: (failed_id) ->
+
+  # abstraction
+  send: (node, message) ->
+    #todo add to node's firebase message queue
+
+
+module.exports = {JobWatcher}


CardInfo: copy change for buttons

CardInfo: copy change for buttons

ref: https://github.com/koding/koding/pull/10189/files#r94361987

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Add CompositeDisposable specs

Add CompositeDisposable specs

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/NeekSandhu/event-kit.git/'


Use underscore.

Use underscore.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/mightymoose/generator-acute.git/'


Ensure we only init CursorHider once

Ensure we only init CursorHider once

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -1124,6 +1124,7 @@
     CursorHider.isScrolling = false

   init: ->
+    return unless @cursorHideStyle?
     @cursorHideStyle = document.createElement("style")
     @cursorHideStyle.innerHTML = """
       body * {pointer-events: none !important; cursor: none !important;}


Get the right match count for find.

Get the right match count for find.

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -710,6 +710,9 @@

   # default to 'smartcase' mode, unless noIgnoreCase is explicitly specified
   findModeQuery.ignoreCase = !hasNoIgnoreCaseFlag && !Utils.hasUpperCase(findModeQuery.parsedQuery)
+
+  # Don't count matches in the HUD.
+  HUD.hide(true)

   # if we are dealing with a regex, grep for all matches in the text, and then call window.find() on them
   # sequentially so the browser handles the scrolling / text selection.


Fix detection of embedded objects.

Fix detection of embedded objects.

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -516,7 +516,7 @@
 # Embedded elements like Flash and quicktime players can obtain focus but cannot be programmatically
 # unfocused.
 #
-isEmbed = (element) -> ["embed", "object"].indexOf(element.nodeName.toLowerCase()) > 0
+isEmbed = (element) -> ["embed", "object"].indexOf(element.nodeName.toLowerCase()) >= 0

 #
 # Input or text elements are considered focusable and able to receieve their own keyboard events,


Try to count only valid instances

Try to count only valid instances

--- packages/rocketchat-statistics/server/functions/get.coffee
+++ packages/rocketchat-statistics/server/functions/get.coffee
@@ -52,7 +52,7 @@

 	statistics.migration = RocketChat.Migrations._getControl()

-	statistics.instanceCount = InstanceStatus.getCollection().find().count()
+	statistics.instanceCount = InstanceStatus.getCollection().find({_updatedAt: {$gt: new Date(Date.now()-process.uptime()*1000-2000)}}).count()

 	if MongoInternals.defaultRemoteCollectionDriver().mongo._oplogHandle?.onOplogEntry? and RocketChat.settings.get('Force_Disable_OpLog_For_Cache') isnt true
 		statistics.oplogEnabled = true


Added Luhn validator

Added Luhn validator

error: pathspec 'app/assets/javascripts/sprangular/helpers/luhn.coffee' did not match any file(s) known to git

--- app/assets/javascripts/sprangular/helpers/luhn.coffee
+++ app/assets/javascripts/sprangular/helpers/luhn.coffee
@@ -0,0 +1,22 @@
+Sprangular.Luhn =
+  isValid: (number) ->
+    number = '' + number
+    return false if number.length < 8 or number.length > 19
+    sum = 0
+    mul = 1
+    l = number.length
+    i = 0
+    while i < l
+      digit = number.substring(l - i - 1, l - i)
+      tproduct = parseInt(digit, 10) * mul
+      if tproduct >= 10
+        sum += (tproduct % 10) + 1
+      else
+        sum += tproduct
+      if mul is 1
+        mul++
+      else
+        mul--
+      i++
+
+    (sum % 10) is 0


fix inconsistent indentation

fix inconsistent indentation

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/topalavlad/taiga-front.git/'


word change order sheed

word change order sheed

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/gurujowa/rails-simple-crm.git/'


Mock Endpoint registration spec

Mock Endpoint registration spec

--- test/unit/webserver/MockEndpointRegistrationSpec.coffee
+++ test/unit/webserver/MockEndpointRegistrationSpec.coffee
@@ -1,9 +1,19 @@
 describe "MockEndpointRegistration", ->

-  beforeEach ()->
-    injector().inject (@MockEndpointRegistration)=>
+  beforeEach (done)->
+    injector().inject (@MockEndpointRegistration, @BaseWebServer, @UsersMockEndpoint)=>
+      @server = new @BaseWebServer()
+      done()

   afterEach ()->

   it "should exist", ->
     expect(@MockEndpointRegistration).to.exist
+
+  it "should register UsersMockEndpoint", ->
+    sinon.spy(@UsersMockEndpoint, "configure")
+    @MockEndpointRegistration.register(@server.app, @server, true)
+
+    console.log "@UsersMockEndpoint.called: #{@UsersMockEndpoint.called}"
+
+    expect(@UsersMockEndpoint.configure.called).to.equal(true)


Added another test of initialisation

Added another test of initialisation

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lonelyplanet/rizzo.git/'


Update problem alert width to be more dynamic

--- app/views/play/level/tome/ProblemAlertView.coffee
+++ app/views/play/level/tome/ProblemAlertView.coffee
@@ -88,8 +88,12 @@
   onWindowResize: (e) =>
     # TODO: This all seems a little hacky
     if @problem?
-      @$el.css('left', $('#goals-view').outerWidth(true) + 'px')
-      @$el.css('right', $('#code-area').outerWidth(true) + 'px')
+      levelContentWidth = $('.level-content').outerWidth(true)
+      goalsViewWidth = $('#goals-view').outerWidth(true)
+      codeAreaWidth = $('#code-area').outerWidth(true)
+      # problem alert view has 20px padding
+      @$el.css('max-width', levelContentWidth - codeAreaWidth - goalsViewWidth + 40 + 'px')
+      @$el.css('right', codeAreaWidth + 'px')

       # 110px from top roughly aligns top of alert with top of first code line
       # TODO: calculate this in a more dynamic, less sketchy way


Always show the graph (empty or otherwise)

--- resources/assets/coffee/react/profile-page/performance.coffee
+++ resources/assets/coffee/react/profile-page/performance.coffee
@@ -29,6 +29,8 @@
     $(window).off '.profilePagePerformance'

   _yAxisTickValues: (data) ->
+    return [] unless data.length
+
     rankRange = d3.extent data, (d) => d.y

     @_allTicks ||= [-1, -2.5, -5]
@@ -48,10 +50,9 @@

     ticks

+
   _rankHistory: ->
-    return unless @props.rankHistories
-
-    data = @props.rankHistories.data
+    data = (@props.rankHistories?.data || [])
       .filter (rank) => rank > 0

     data = data.map (rank, i) =>
@@ -108,5 +109,4 @@
       h2 className: 'profile-extra__title', Lang.get('users.show.extra.performance.title')

       div
-        className: 'hidden' unless @props.rankHistories
         div ref: 'chartArea', className: 'chart'


Remove loading indicator after render.

Remove loading indicator after render.

--- core/htdocs_source/src/pods/openxpki/route.coffee
+++ core/htdocs_source/src/pods/openxpki/route.coffee
@@ -34,8 +34,9 @@
                     @controllerFor("openxpki").set "content", [doc]
             if doc.goto
                 @transitionTo "openxpki", doc.goto
-            $(".loading").hide()
-            $(".btn-loading").removeClass("btn-loading")
+            Em.run.scheduleOnce "afterRender", ->
+                $(".loading").hide()
+                $(".btn-loading").removeClass("btn-loading")
             doc
         , (err) ->
             $(".loading").hide()


parallaxing options

parallaxing options

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/human-nyc/spree_obesityandspeed.git/'


Nodejs Web Server Tests: add confirm.test file

error: pathspec 'servers/lib/server/handlers/confirm.test.coffee' did not match any file(s) known to git

--- servers/lib/server/handlers/confirm.test.coffee
+++ servers/lib/server/handlers/confirm.test.coffee
@@ -0,0 +1,112 @@
+{ daisy
+  expect
+  request
+  generateRandomString
+  generateRandomUsername
+  checkBongoConnectivity }       = require '../../../testhelper'
+{ testCsrfToken }                = require '../../../testhelper/handler'
+{ generateConfirmRequestParams } = require '../../../testhelper/handler/confirmhelper'
+{ withRegisteredUser }           = require '../../../testhelper/handler/registerhelper'
+{ createJWT }                    = require '../../../models/user'
+
+JSession = require '../../../models/session'
+
+
+beforeTests = -> before (done) ->
+
+  checkBongoConnectivity done
+
+
+runTests = -> describe 'server.handlers.confirm', ->
+
+  it 'should fail when csrf token is invalid', (done) ->
+
+    withRegisteredUser ({ username }) ->
+      options  = { qs : { token : createJWT { username } } }
+      testCsrfToken generateConfirmRequestParams, 'get', options, done
+
+
+  it 'should send HTTP 400 when token is not provided', (done) ->
+
+    withRegisteredUser ({ username }) ->
+
+      confirmRequestParams = generateConfirmRequestParams
+        qs : { token : '' }
+
+      request.get confirmRequestParams, (err, res, body) ->
+        expect(err).to.not.exist
+        expect(res.statusCode).to.be.equal 400
+        expect(body).be.empty
+        done()
+
+
+  it 'should send HTTP 500 when there is no token in JWT', (done) ->
+
+    withRegisteredUser ({ username }) ->
+
+      confirmRequestParams = generateConfirmRequestParams
+        qs : { token : createJWT {} }
+
+      request.get confirmRequestParams, (err, res, body) ->
+        expect(err).to.not.exist
+        expect(res.statusCode).to.be.equal 500
+        expect(body).be.empty
+        done()
+
+
+  it 'should send HTTP 500 when user is not a registered one', (done) ->
+
+    username = generateRandomUsername()
+    jwtToken = createJWT { username }
+
+    confirmRequestParams = generateConfirmRequestParams
+      qs : { token : jwtToken }
+
+    request.get confirmRequestParams, (err, res, body) ->
+      expect(err).to.not.exist
+      expect(res.statusCode).to.be.equal 500
+      expect(body).be.empty
+      done()
+
+
+  it 'should send HTTP 200 when token and user are both valid', (done) ->
+
+    username  = generateRandomUsername()
+    groupName = generateRandomString()
+
+    withRegisteredUser ({ username }) ->
+
+      jwtToken = createJWT { username, groupName }
+
+      queue = [
+
+        ->
+          confirmRequestParams = generateConfirmRequestParams
+            qs : { token : jwtToken }
+
+          request.get confirmRequestParams, (err, res, body) ->
+            expect(err).to.not.exist
+            expect(res.statusCode).to.be.equal 200
+            expect(body).not.to.be.empty
+            queue.next()
+
+
+        ->
+          # expecting a session to be created
+          JSession.one { username, groupName }, (err, session) ->
+            expect(err).to.not.exist
+            expect(session).to.exist
+            queue.next()
+
+        -> done()
+
+      ]
+
+      daisy queue
+
+
+beforeTests()
+
+runTests()
+
+


AJ-1573 Building out 'grade rubric' page.

error: pathspec 'app/assets/javascripts/angular/controllers/GradeRubricCtrl.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/angular/controllers/GradeRubricCtrl.js.coffee
+++ app/assets/javascripts/angular/controllers/GradeRubricCtrl.js.coffee
@@ -0,0 +1,238 @@
+@gradecraft.controller 'GradeRubricCtrl', ($scope, Restangular, $http) ->
+
+  INTEGER_REGEXP = /^\-?\d+$/
+  Restangular.setRequestSuffix('.json')
+  $scope.metrics = []
+  $scope.savedMetricCount = 0
+
+  $scope.init = (rubricId, metrics)->
+    $scope.rubricId = rubricId
+    $scope.addMetrics(metrics)
+
+  $scope.showMetric = (attrs)->
+    new MetricPrototype(attrs)
+
+  $scope.countSavedMetric = () ->
+    $scope.savedMetricCount += 1
+
+  MetricPrototype = (attrs={})->
+    this.tiers = []
+    this.id = if attrs.id then attrs.id else null
+    this.addTiers(attrs["tiers"]) if attrs["tiers"] #add tiers if passed on init
+    this.name = if attrs.name then attrs.name else ""
+    this.rubricId = if attrs.rubric_id then attrs.rubric_id else $scope.rubricId
+    this.max_points = if attrs.max_points then attrs.max_points else null
+    this.description = if attrs.description then attrs.description else ""
+    this.hasChanges = false
+  MetricPrototype.prototype =
+    addTier: (attrs={})->
+      self = this
+      newTier = new TierPrototype(self, attrs)
+      this.tiers.push newTier
+    addTiers: (tiers)->
+      self = this
+      angular.forEach(tiers, (tier,index)->
+        self.addTier(tier)
+      )
+    isNew: ()->
+      this.id is null
+    isSaved: ()->
+      this.id != null
+    change: ()->
+      self = this
+      if this.isSaved()
+        self.hasChanges = true
+    resetChanges: ()->
+      this.hasChanges = false
+    resourceUrl: ()->
+      "/metrics/#{self.id}"
+    order: ()->
+      jQuery.inArray(this, $scope.metrics)
+    params: ()->
+      self = this
+      {
+        name: self.name,
+        max_points: self.max_points,
+        order: self.order(),
+        description: self.description,
+        rubric_id: self.rubricId
+      }
+    index: ()->
+      this.order()
+    destroy: ()->
+
+    remove:(index)->
+      $scope.metrics.splice(index,1)
+    create: ()->
+      self = this
+      Restangular.all('metrics').post(this.params())
+        .then (response)->
+          alert(response.id)
+          self.id = response.id
+          $scope.countSavedMetric()
+
+    modify: (form)->
+      if form.$valid
+        if this.isNew()
+          this.create()
+        else
+          this.update()
+
+    update: ()->
+      self = this
+      if this.hasChanges
+        Restangular.one('metrics', self.id).customPUT(self.params())
+          .then(
+            ()-> , #success
+            ()-> # failure
+          )
+          self.resetChanges()
+
+    delete: (index)->
+      self = this
+      if confirm("Are you sure you want to delete this metric? Deleting this metric will delete its tiers as well.")
+        if this.isSaved()
+          $http.delete("/metrics/#{self.id}").success(
+            (data,status)->
+              self.remove(index)
+          )
+          .error((err)->
+            alert("delete failed!")
+          )
+        else
+          self.remove(index)
+
+  $scope.addMetrics = (existingMetrics)->
+    angular.forEach(existingMetrics, (em, index)->
+      emProto = new MetricPrototype(em)
+      $scope.countSavedMetric() # indicate saved metric present
+      $scope.metrics.push emProto
+    )
+
+  $scope.newMetric = ()->
+    $scope.metrics.push new(MetricPrototype)
+
+  $scope.getNewMetric = ()->
+    $scope.newerMetric = Restangular.one('metrics', 'new.json').getList().then ()->
+      alert("waffles!")
+
+  $scope.viewMetrics = ()->
+    if $scope.metrics.length > 0
+      $scope.displayMetrics = []
+      angular.forEach($scope.metrics, (value, key)->
+        $scope.displayMetrics.push(value.name)
+      )
+      $scope.displayMetrics
+
+  $scope.existingMetrics = []
+
+  TierPrototype = (metric, attrs={})->
+    this.id = attrs.id or null
+    this.metric = metric
+    this.metric_id = metric.id
+    this.name = attrs.name or ""
+    this.points = attrs.points || null
+    this.description = attrs.description or ""
+    this.resetChanges()
+  TierPrototype.prototype =
+    isNew: ()->
+      this.id is null
+    isSaved: ()->
+      this.id > 0
+    change: ()->
+      self = this
+      if this.isSaved()
+        self.hasChanges = true
+    resetChanges: ()->
+      this.hasChanges = false
+    params: ()->
+      metric_id: this.metric_id,
+      name: this.name,
+      points: this.points,
+      description: this.description
+    create: ()->
+      self = this
+      Restangular.all('tiers').post(self.params())
+        .then(
+          (response)-> #success
+            self.id = response.id
+          (response)-> #error
+        )
+
+    modify: (form)->
+      if form.$valid
+        if this.isNew()
+          this.create()
+        else
+          this.update()
+
+    update: ()->
+      if this.hasChanges
+        self = this
+        Restangular.one('tiers', self.id).customPUT(self.params())
+          .then(
+            ()-> #success
+            ()-> #failure
+          )
+          self.resetChanges()
+
+     metricName: ()->
+       alert this.metric.name
+
+     delete: (index)->
+      self = this
+      if confirm("Are you sure you want to delete this tier?")
+        if this.isSaved()
+          $http.delete("/tiers/#{self.id}").success(
+            (data,status)->
+              self.removeFromMetric(index)
+              return true
+          )
+          .error((err)->
+            alert("delete failed!")
+            return false
+          )
+        else
+          self.removeFromMetric(index)
+     removeFromMetric: (index)->
+       this.metric.tiers.splice(index,1)
+
+  # declare a sortableEle variable for the sortable function
+  sortableEle = undefined
+
+  # action when a sortable drag begins
+  $scope.dragStart = (e, ui) ->
+    ui.item.data "start", ui.item.index()
+    return
+
+  # action when a sortable drag completes
+  $scope.dragEnd = (e, ui) ->
+    start = ui.item.data("start")
+    end = ui.item.index()
+    $scope.metrics.splice end, 0, $scope.metrics.splice(start, 1)[0]
+    $scope.$apply()
+    $scope.updateMetricOrder()
+    return
+
+  # send the metric order to the server with ids
+  $scope.updateMetricOrder = ()->
+    if $scope.savedMetricCount > 0
+      $http.put("/metrics/update_order", metric_order: $scope.orderedMetrics()).success(
+      )
+      .error(
+      )
+
+  # distill key/value pairs for metric ids and relative order
+  $scope.orderedMetrics = ()->
+    metrics = {}
+    angular.forEach($scope.metrics, (value, index)->
+      metrics[value.id] = {order: index} if value.id != null
+    )
+    metrics
+
+  sortableEle = $("#metric-box").sortable(
+    start: $scope.dragStart
+    update: $scope.dragEnd
+  )
+  return
+


don't click on document

don't click on document

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/tracersoft/mediadrawer-rails.git/'


Less geometric random borders for the terrain generator

--- app/views/editor/level/modal/terrain_randomize_modal.coffee
+++ app/views/editor/level/modal/terrain_randomize_modal.coffee
@@ -66,6 +66,7 @@
   'borderSize': {
     'x':4
     'y':4
+    'thickness':2
   }
 }

@@ -114,36 +115,38 @@

   randomizeBorder: (preset, presetSize) ->
     for i in _.range(0-sizes.floorSize.x/2+sizes.borderSize.x, presetSize.x-sizes.floorSize.x/2, sizes.borderSize.x)
-      @thangs.push {
-        'id': @getRandomThang(preset.borders)
-        'pos': {
-          'x': i
-          'y': 0-sizes.floorSize.x/2
+      for j in _.range(sizes.borderSize.thickness)
+        @thangs.push {
+          'id': @getRandomThang(preset.borders)
+          'pos': {
+            'x': i + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
+            'y': 0 - sizes.floorSize.x/2 + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
+          }
         }
-      }
-      @thangs.push {
-        'id': @getRandomThang(preset.borders)
-        'pos': {
-          'x': i
-          'y': presetSize.y - sizes.borderSize.y
+        @thangs.push {
+          'id': @getRandomThang(preset.borders)
+          'pos': {
+            'x': i + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
+            'y': presetSize.y - sizes.borderSize.y + _.random(-sizes.borderSize.x/2, sizes.borderSize.x/2)
+          }
         }
-      }

     for i in _.range(0-sizes.floorSize.y/2, presetSize.y-sizes.borderSize.y, sizes.borderSize.y)
-      @thangs.push {
-        'id': @getRandomThang(preset.borders)
-        'pos': {
-          'x': 0-sizes.floorSize.x/2+sizes.borderSize.x
-          'y': i
+      for j in _.range(3)
+        @thangs.push {
+          'id': @getRandomThang(preset.borders)
+          'pos': {
+            'x': 0-sizes.floorSize.x/2+sizes.borderSize.x + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
+            'y': i + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
+          }
         }
-      }
-      @thangs.push {
-        'id': @getRandomThang(preset.borders)
-        'pos': {
-          'x': presetSize.x - sizes.borderSize.x - sizes.floorSize.x/2
-          'y': i
+        @thangs.push {
+          'id': @getRandomThang(preset.borders)
+          'pos': {
+            'x': presetSize.x - sizes.borderSize.x - sizes.floorSize.x/2 + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
+            'y': i + _.random(-sizes.borderSize.y/2, sizes.borderSize.y/2)
+          }
         }
-      }

   randomizeDecorations: (preset, presetSize)->
     for name, decoration of preset.decorations


Fixed sprites often disappearing when idle.

--- app/lib/surface/SegmentedSprite.coffee
+++ app/lib/surface/SegmentedSprite.coffee
@@ -182,6 +182,7 @@

   tick: (delta) ->
     return if @paused or not @baseMovieClip
+    return @paused = true if @animLength is 1
     newFrame = @currentFrame + @framerate * delta / 1000

     if newFrame > @animLength
@@ -194,6 +195,8 @@
         @dispatchEvent('animationend')
       else
         newFrame = newFrame % @animLength
+
+    return if @currentFrame is newFrame

     if @frames
       prevFrame = Math.floor(newFrame)


Fix alignment for mutual

Fix alignment for mutual

--- resources/assets/coffee/react/_components/friend-button.coffee
+++ resources/assets/coffee/react/_components/friend-button.coffee
@@ -121,9 +121,10 @@
             el Icon, name: 'user-times', modifiers: ['fw']
           else
             if @state.friend.mutual
-              div {},
-                el Icon, name: 'user'
-                el Icon, name: 'user'
+              [
+                el Icon, name: 'user', key: 1
+                el Icon, name: 'user', key: 2
+              ]
             else
               el Icon, name: 'user', modifiers: ['fw']
         else


Masonry product_ul on the search page.

Masonry product_ul on the search page.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/gmist/five-studio2.git/'


safety commit

safety commit

error: pathspec 'lib/components/select2/lib/mixins/EventLogs.mixin.coffee' did not match any file(s) known to git

--- lib/components/select2/lib/mixins/EventLogs.mixin.coffee
+++ lib/components/select2/lib/mixins/EventLogs.mixin.coffee
@@ -0,0 +1,86 @@
+# # Eventlogs Mixin
+
+# Include this mixin in your class like so :
+
+###
+  ```coffeescript
+    class Whatever extends Component
+      @extend Select2Mixins.Eventlogs
+  ```
+###
+
+# Getter setter methods will be created for you instance properties if you add them to the data context in your constructor.
+
+###
+  ```coffeescript
+    class Whatever extends Component
+      @extend Select2Mixins.Eventlogs
+      constructor: ( context = {} ) ->
+        @data.instanceProperty = @instanceProperty
+        super
+  ```
+###
+
+# ## Function
+
+# The EventLogs Mixin provides basic logging for all select2 initiated events.
+# These events can be overriden by another mixin that is included after or by events on the base class.
+
+# ## Debugging Events
+
+# All events can be used by the debug log catch alls "all" and "events".
+# A specific event can be monitored by "<evenName>".
+
+###
+  {{#select2 debug="change" }}
+    <option value="1" selected>one</option>
+    <option vaule="2">two</option>
+  {{/select2}}
+###
+
+Select2Mixins.EventLogs =
+  extended: ->
+    @include
+      events:
+        "change": ( event, template ) ->
+          template.log "event:change", {
+            val:event.val
+            added:event.added
+            removed:event.removed
+          }
+
+        "select2-opening": ( event, template ) -> template.log "event:opening"
+
+        "select2-open": ( event, template ) -> template.log "event:open"
+
+        "select2-close": ( event, template ) -> template.log "event:close"
+
+        "select2-highlight": ( event, template )->
+          template.log "event:highlighted", {
+            val: event.val
+            choice: event.choice
+          }
+
+        "select2-selecting": ( event, template ) ->
+          template.log "event:selecting", {
+            val: event.val
+            choice: event.choice
+          }
+
+        "select2-removing": ( event, template ) ->
+          template.log "event:removing", {
+            val: event.val
+            choice: event.choice
+          }
+
+        "select2-removed": ( event, template ) ->
+          template.log "event:removed", {
+            val: event.val
+            choice: event.choice
+          }
+
+        "select2-loaded": ( event, template ) -> template.log "event:loaded (data property omitted for brevity)"
+
+        "select2-focus": ( event, template ) -> template.log "event:focus"
+
+        "select2-blur": ( event, template ) -> template.log "event:blur"


Fix gettext guidance violation

Fix gettext guidance violation

1. No string concatenation should be used in the gettext function.
2. Some extra parentheses should be used in coffee script, to avoid the following situation: in coffee script, the call ```gettext "text to be extracted" + "text should not be extracted"``` will be translated into ```gettext("text to be extracted" + "text should not be extracted")``` rather than ```gettext("text to be extracted") + "text should not be extracted"```.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bmedx/modulestore.git/'


Initialize widget toolbar using sorted names

If looping object by keys the order may change which causes the widgets
to be in different order after a page refresh. Use sorted keys when
going through the widgets so they stay in same order.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/leonidas/qa-dashboard.git/'


fix of coffeelint errors in spec tests

fix of coffeelint errors in spec tests

--- spec/text-editor-component-spec.coffee
+++ spec/text-editor-component-spec.coffee
@@ -1578,19 +1578,19 @@

         describe "when there are multiple cursors, and one of the cursor's screen position is the same as the mouse click screen position", ->
           it "removes a cursor at the mouse screen position", ->
-            editor.setCursorScreenPosition([3,4])
-            editor.addCursorAtScreenPosition([5,2])
+            editor.setCursorScreenPosition([3, 4])
+            editor.addCursorAtScreenPosition([5, 2])
             editor.addCursorAtScreenPosition([7, 5])
-            linesNode.dispatchEvent(buildMouseEvent('mousedown', clientCoordinatesForScreenPosition([3,4]), metaKey: true))
+            linesNode.dispatchEvent(buildMouseEvent('mousedown', clientCoordinatesForScreenPosition([3, 4]), metaKey: true))
             nextAnimationFrame()
-            expect(editor.getSelectedScreenRanges()).toEqual [[[5,2], [5,2]], [[7,5], [7,5]]]
+            expect(editor.getSelectedScreenRanges()).toEqual [[[5, 2], [5, 2]], [[7, 5], [7, 5]]]

         describe "when there is a single cursor and the click occurs at the cursor's screen position", ->
           it "neither adds a new cursor nor removes the current cursor", ->
             editor.setCursorScreenPosition([3, 4])
-            linesNode.dispatchEvent(buildMouseEvent('mousedown', clientCoordinatesForScreenPosition([3,4]), metaKey: true))
+            linesNode.dispatchEvent(buildMouseEvent('mousedown', clientCoordinatesForScreenPosition([3, 4]), metaKey: true))
             nextAnimationFrame()
-            expect(editor.getSelectedScreenRanges()).toEqual [[[3,4], [3,4]]]
+            expect(editor.getSelectedScreenRanges()).toEqual [[[3, 4], [3, 4]]]

     describe "when a non-folded line is double-clicked", ->
       describe "when no modifier keys are held down", ->


:lipstick:

:lipstick:

--- src/browser/auto-update-manager.coffee
+++ src/browser/auto-update-manager.coffee
@@ -71,7 +71,7 @@
       atomWindow.sendCommand('window:update-available', [@releaseVersion, @releaseNotes])

   setState: (state) ->
-    return unless @state != state
+    return if @state is state
     @state = state
     @emit 'state-changed', @state


[docs] examples of using guards and indices in array comprehensions

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/maowug/coffeescript.git/'


commit

commit

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Romaboy/awesomeadmin.git/'


Fixing broken blur call

Fixing broken blur call

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/douggr/atom-project-manager.git/'


Uncaught TypeError: Cannot read property 'length' of undefined Fix #61

The issue with using alt + click on class names still occurred due to classesResponse not being unless and yet not having the autocomplete property. This should fix it.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/Adirelle/atom-autocomplete-php.git/'


Removed: unused code

Removed: unused code

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/clochix/cozy-emails.git/'


feat:show confirmation dialog after pressing run orchestration manually button

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/keboola/kbc-ui-orchestrators.git/'


show "Logging out..." when user clicks logout button

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/UCSFMemoryAndAging/tabcat.git/'


Initial commit

Initial commit

Transcompiles in to JavaScript. | Grunt Task: $ grunt build

error: pathspec 'core/coffee/module/config.coffee' did not match any file(s) known to git

--- core/coffee/module/config.coffee
+++ core/coffee/module/config.coffee
@@ -0,0 +1,26 @@
+###!
+# -------
+# Slappé®
+# -------
+# A smart node module to slap out conventional database system.
+# ___________________________________________________________________________
+#
+# Architecture and Code Handcrafted by Prabhat Kumar.
+# Architectuur en Code handgemaakt door Prabhat Kumar.
+# @author    : Prabhat Kumar [http://prabhatkumar.org/].
+# @copyright : Prabhat Kumar [http://prabhatkumar.org/].
+# @copyright : Sequømics Research [http://research.sequomics.com/].
+# @copyright : Sequømics Corporation [http://sequomics.com/].
+# ___________________________________________________________________________
+#
+# @date      : 21-Dec-2016
+# @license   : MIT
+# @require   : Node.js®
+# @require   : NPM
+# @build     : SEED™ — Skövde
+#              └────── A Sequømics Product — http://seed.sequomics.com/.
+# ___________________________________________________________________________
+#
+# --/The Heart of Data System/-- of "Slappé®".
+# ___________________________________________________________________________
+###


specs for different error types

specs for different error types

error: pathspec 'coach/specs/concept-coach/error-notification.spec.cjsx' did not match any file(s) known to git

--- coach/specs/concept-coach/error-notification.spec.cjsx
+++ coach/specs/concept-coach/error-notification.spec.cjsx
@@ -0,0 +1,58 @@
+{Testing, sinon, _, React, ReactTestUtils} = require 'shared/specs/helpers'
+
+{ConceptCoach}    = require 'concept-coach/base'
+ErrorNotification = require 'concept-coach/error-notification'
+
+TASK  = require '../../api/cc/tasks/C_UUID/m_uuid/GET'
+tasks = require 'task/collection'
+api   = require 'api'
+cloneDeep = require 'lodash/cloneDeep'
+
+Course = require 'course/model'
+AUTH_DATA = require '../../auth/status/GET'
+
+ERROR =
+  response:
+    status: 500
+    statusText: 'Its On Fire!'
+    data:
+      errors: [ {code: 'test_test_test'} ]
+
+describe 'CC Error Notification Component', ->
+  beforeEach ->
+    @props =
+      course: new Course(_.first(AUTH_DATA.courses))
+      close: sinon.spy()
+      moduleUUID: 'm_uuid'
+      collectionUUID: 'C_UUID'
+    tasks.load("#{@props.collectionUUID}/#{@props.moduleUUID}",  TASK)
+
+  it "doesn't render by default", ->
+    wrapper = shallow(<ErrorNotification {...@props} />)
+    expect(wrapper.html()).to.be.null
+    undefined
+
+  it 'shows error details by default', ->
+    wrapper = shallow(<ErrorNotification {...@props} />)
+    api.channel.emit('error', ERROR)
+    expect(wrapper.find('ModalTitle').render().text()).to.equal('Server Error encountered')
+    expect(wrapper.find('ModalBody').render().text()).to.include('test_test_test')
+    undefined
+
+  it 'renders course not started', ->
+    wrapper = shallow(<ErrorNotification {...@props} />)
+    error = cloneDeep(ERROR)
+    error.response.data.errors[0].code = 'course_not_started'
+    api.channel.emit('error', error)
+    expect(wrapper.find('ModalTitle').render().text()).to.equal('Future Course')
+    expect(wrapper.find('ModalBody').render().text()).to.include('not yet started')
+    undefined
+
+  it 'renders course has ended', ->
+    wrapper = shallow(<ErrorNotification {...@props} />)
+    error = cloneDeep(ERROR)
+    error.response.data.errors[0].code = 'course_ended'
+    api.channel.emit('error', error)
+    expect(wrapper.find('ModalTitle').render().text()).to.equal('Past Course')
+    expect(wrapper.find('ModalBody').render().text()).to.include('course ended')
+    undefined


Remove $parent

Remove $parent

--- app/assets/javascripts/labels_select.js.coffee
+++ app/assets/javascripts/labels_select.js.coffee
@@ -2,15 +2,14 @@
   constructor: ->
     $('.js-label-select').each (i, dropdown) ->
       $dropdown = $(dropdown)
-      $parent = $dropdown.parent()
       projectId = $dropdown.data('project-id')
       labelUrl = $dropdown.data('labels')
       issueUpdateURL = $dropdown.data('issueUpdate')
       selectedLabel = $dropdown.data('selected')
       if selectedLabel?
         selectedLabel = selectedLabel.split(',')
-      newLabelField = $('#new_label_name', $parent)
-      newColorField = $('#new_label_color', $parent)
+      newLabelField = $('#new_label_name')
+      newColorField = $('#new_label_color')
       showNo = $dropdown.data('show-no')
       showAny = $dropdown.data('show-any')
       defaultLabel = $dropdown.data('default-label')
@@ -19,9 +18,9 @@
       $block = $selectbox.closest('.block')
       $sidebarCollapsedValue = $block.find('.sidebar-collapsed-icon span')
       $value = $block.find('.value')
-      $newLabelError = $('.js-label-error', $parent)
-      $colorPreview = $('.js-dropdown-label-color-preview', $parent)
-      $newLabelCreateButton = $('.js-new-label-btn', $parent)
+      $newLabelError = $('.js-label-error')
+      $colorPreview = $('.js-dropdown-label-color-preview')
+      $newLabelCreateButton = $('.js-new-label-btn')

       $newLabelError.hide()
       $loading = $block.find('.block-loading').fadeOut()


Immediately hide element if its opacity is already 0

And don't forget to run the callback

--- resources/assets/coffee/fade.coffee
+++ resources/assets/coffee/fade.coffee
@@ -27,10 +27,15 @@

   out: (el, callback) ->
-    @queue.push ->
-      el.style.opacity = '0'
-      el.classList.add 'js-fade--out'
-      el._js_fade_out_callback = callback
+    if getComputedStyle(el).opacity == '0'
+      @queue.push ->
+        el.style.display = 'none'
+        callback() if callback
+    else
+      @queue.push ->
+        el.style.opacity = '0'
+        el.classList.add 'js-fade--out'
+        el._js_fade_out_callback = callback

     @runQueue()


Create simditor-date-button.coffee

Create simditor-date-button.coffee

error: pathspec 'src/simditor-date-button.coffee' did not match any file(s) known to git

--- src/simditor-date-button.coffee
+++ src/simditor-date-button.coffee
@@ -0,0 +1,47 @@
+class DateButton extends Simditor.Button
+
+  name: 'date'
+
+  icon: 'none fa fa-clock-o'
+
+  htmlTag: 'span'
+
+  needFocus: true
+
+  _status: ->
+
+  command: ->
+    $rootBlock = @editor.selection.rootNodes().first()
+    $nextBlock = $rootBlock.next()
+
+    if $nextBlock.length > 0
+      @editor.selection.save()
+    else
+      $newBlock = $('<p/>').append @editor.util.phBr
+
+    $span = $('<span/>').text(@_getDate()).insertAfter $rootBlock
+
+    if $newBlock
+      $newBlock.insertAfter $span
+      @editor.selection.setRangeAtStartOf $newBlock
+    else
+      @editor.selection.restore()
+
+    @editor.trigger 'valuechanged'
+
+  _getDate: ->
+    now = new Date()
+    day = now.getDate()
+    month = now.getMonth()
+    year = now.getFullYear()
+
+    parse = (n) -> if n > 9 then n else "0#{n}"
+
+    fulldate = [parse(day), parse(month), year].join '/'
+
+    time = now.toString().match(/\d\d:\d\d:\d\d/)[0]
+
+    "#{fulldate} #{time} "
+
+Simditor.Toolbar.addButton DateButton
+


UpdateStackTemplate: helper for creating new or updating existing stack templates

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/andrewjcasal/koding.git/'


Model methods to block / unblock direct message subscription

--- packages/rocketchat-lib/server/models/Subscriptions.coffee
+++ packages/rocketchat-lib/server/models/Subscriptions.coffee
@@ -304,6 +304,40 @@

 		return @update query, update, { multi: true }

+	setBlocked: (blocked, blocker) ->
+		query =
+			rid: blocked + blocker
+
+		update =
+			$set:
+				blocked: 1
+
+		query2 =
+			rid: blocker + blocked
+
+		update2 =
+			$set:
+				blocker: 1
+
+		return @update(query, update) and @update(query2, update2)
+
+	unsetBlocked: (blocked, blocker) ->
+		query =
+			rid: blocked + blocker
+
+		update =
+			$unset:
+				blocked: 1
+
+		query2 =
+			rid: blocker + blocked
+
+		update2 =
+			$unset:
+				blocker: 1
+
+		return @update(query, update) and @update(query2, update2)
+
 	updateTypeByRoomId: (roomId, type) ->
 		query =
 			rid: roomId


finesse the smart number

finesse the smart number

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/UM-USElab/gradecraft-development.git/'


commit

commit


Removed some unnecessary callbacks.

Removed some unnecessary callbacks.

--- app/views/play/ladder/ladder_tab.coffee
+++ app/views/play/ladder/ladder_tab.coffee
@@ -141,16 +141,13 @@
     @topPlayers = new LeaderboardCollection(@level, {order:-1, scoreOffset: HIGHEST_SCORE, team: @team, limit: 20})
     promises = []
     promises.push @topPlayers.fetch()
-    @topPlayers.once 'sync', @onceLeaderboardPartLoaded, @

     if @session
       score = @session.get('totalScore') or 10
       @playersAbove = new LeaderboardCollection(@level, {order:1, scoreOffset: score, limit: 4, team: @team})
       promises.push @playersAbove.fetch()
-      @playersAbove.once 'sync', @onceLeaderboardPartLoaded, @
       @playersBelow = new LeaderboardCollection(@level, {order:-1, scoreOffset: score, limit: 4, team: @team})
       promises.push @playersBelow.fetch()
-      @playersBelow.once 'sync', @onceLeaderboardPartLoaded, @
       level = "#{level.get('original')}.#{level.get('version').major}"
       success = (@myRank) =>
       promises.push $.ajax "/db/level/#{level}/leaderboard_rank?scoreOffset=#{@session.get('totalScore')}&team=#{@team}", {success}


Change default port definition

Change default port definition

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ChHeLeJa/SpaceTrader.git/'


fix datepicker

fix datepicker

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/ofoso/ofo.git/'


Fixed the toggle bug on single archive page. (#2329)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/evercam/evercam-dashboard.git/'


creating color check js

creating color check js

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/startae/hub.git/'


Update Post Controller

Update Post Controller

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/RizkiMufrizal/Aplikasi-Post-Status.git/'


Lists: Add error handling to RecordSelector

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/patricklindsay/integral.git/'


Reload changes page periodically.

Reload changes page periodically.

error: pathspec 'app/assets/javascripts/reload_changes.js.coffee' did not match any file(s) known to git

--- app/assets/javascripts/reload_changes.js.coffee
+++ app/assets/javascripts/reload_changes.js.coffee
@@ -0,0 +1,5 @@
+$ ->
+  if $('h1').html() == 'Changes'
+    setTimeout(->
+      location.reload()
+    , 10 * 1000)


Refresh users dropdoen when user share camera


Remove the initial state

Remove the initial state

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/lonelyplanet/rizzo.git/'


:alarm_clock: Show started and ended time when input command '퇴근'

- Fix problem that removing all firebase row in workTimes when deploy to heroku
- Change naming(sna_ke to caMel)

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/opengallery/og-bot.git/'


Fixed bug with pjax constructor

Fixed bug with pjax constructor


Added hh_format beautifier

Added hh_format beautifier

error: pathspec 'src/beautifiers/hh_format.coffee' did not match any file(s) known to git

--- src/beautifiers/hh_format.coffee
+++ src/beautifiers/hh_format.coffee
@@ -0,0 +1,20 @@
+###
+Requires http://hhvm.com/
+###
+
+"use strict"
+Beautifier = require('./beautifier')
+
+module.exports = class HhFormat extends Beautifier
+  name: "hh_format"
+  link: "http://hhvm.com/"
+
+  options: {
+    PHP: true
+  }
+
+  beautify: (text, language, options) ->
+    @run("hh_format", [
+      "-i",
+      @tempFile("input", text)
+      ])


tab now goes to the editor.

tab now goes to the editor.

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/robey/carrot16.git/'


bug fix

bug fix

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/bubblegroup/bubblebot.git/'


Wrong class and missing percent sign

Wrong class and missing percent sign

--- resources/assets/coffee/react/profile-page/stats.coffee
+++ resources/assets/coffee/react/profile-page/stats.coffee
@@ -28,7 +28,7 @@

         el 'div', className: 'profile-exp-bar',
           el 'div',
-            className: 'profile-exp-bar--fill'
+            className: 'profile-exp-bar__fill'
             style:
               width: "#{@props.stats.level.progress.toFixed()}%"

@@ -36,7 +36,7 @@
           el 'dt', className: 'profile-stats__stat-key',
             Lang.get 'users.show.stats.level', level: @props.stats.level.current
           el 'dd', className: 'profile-stats__stat-value, profile-stats__stat-value--light',
-            "#{@props.stats.level.progress.toFixed()}"
+            "#{@props.stats.level.progress.toFixed()}%"

       el 'div', className: 'page-contents__row',
         elements.map (m) =>


fix ping impl, still timeouts but doesn't crash

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/AppGyver/supersonic.git/'


add close on [esc] for commit dialog

add close on [esc] for commit dialog

--- lib/widgets/commit-dialog.coffee
+++ lib/widgets/commit-dialog.coffee
@@ -5,7 +5,7 @@
 module.exports =
 class Dialog extends View
   @content: ->
-    @div class: 'dialog context-git', =>
+    @div class: 'dialog context-git', keyup: 'keyup', =>
       @div class: 'heading', =>
         @i class: 'icon x clickable', click: 'cancel'
         @strong 'Commit'
@@ -60,6 +60,10 @@
   deactivate: ->
     @modalPanel.destroy()
     @detach()
+    return
+
+  keyup: (event, dialog) ->
+    @cancel() if event.keyCode == 27
     return

   getFiles: ->