Update server lint task names.

Update server lint task names.

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/knottie/example.git/'


minor refactor

minor refactor

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/core-network/client-threejs.git/'


client: remove CommonInnerNavigationListItem

Signed-off-by: Umut Sirin <4055abbc0e40a1254e715b952ccd414607e0b365@gmail.com>

--- client/app/lib/commonviews/commoninnernavigationlistitem.coffee
+++ client/app/lib/commonviews/commoninnernavigationlistitem.coffee
@@ -1,15 +0,0 @@
-kd = require 'kd'
-KDListItemView = kd.ListItemView
-
-
-module.exports = class CommonInnerNavigationListItem extends KDListItemView
-
-  constructor : (options = {}, data) ->
-
-    options.tagName  or= 'a'
-    options.attributes = { href : data.slug or '#' }
-    options.partial  or= data.title
-
-    super options, data
-
-  partial: -> ''


Fix typo errors for set value in id

Fix typo errors for set value in id

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/salder45/guestBook.git/'


Now it's really done lol.

Now it's really done lol.

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/trsantos/sourcerer.git/'


set the button to red when in call to alert user

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/VoiSmart/Rocket.Chat.git/'


Include lang in the i18n object

Include lang in the i18n object

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/craftedlabs/rubyconfuruguay-mobile.git/'


Update _loadConfigs to support environment var replacement.

Configuration items specified as a string, which start with
"process.env." will be automatically replace with the matching
environment variable's value.

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-server.git/'


Clean

Clean

--- src/daemon/app/index.coffee
+++ src/daemon/app/index.coffee
@@ -1,4 +1,3 @@
-logme = require 'logme'
 monitor = require './monitor'
 util = require './util'


support +=

support +=

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/showell/CoffeeCoffee.git/'


Remove configuration section, will be explained in README.md

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/tombell/hubot-github-identity.git/'


Gruntfile

Gruntfile

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

--- src/frontend/gruntfile.coffee
+++ src/frontend/gruntfile.coffee
@@ -0,0 +1,70 @@
+module.exports = (grunt) ->
+  grunt.initConfig
+    pkg: grunt.file.readJSON "package.json"
+
+    meta:
+      file: 'dagora'
+      endpoint: 'package/static'
+      banner: """
+        /* <%= pkg.name %> v<%= pkg.version %> - <%= grunt.template.today("m/d/yyyy") %>
+           <%= pkg.homepage %>
+           Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %> - Licensed <%= _.pluck(pkg.license, "type").join(", ") %> */
+
+        """
+
+    source:
+      coffee: [
+        'monocle/*.coffee',
+        'monocle/models/*.coffee',
+        'monocle/views/*.coffee',
+        'monocle/controllers/*.coffee']
+
+      stylesheets: [
+        'stylesheets/*.styl']
+
+      css_core: [
+        'components/tuktuk/tuktuk.css',
+        'components/tuktuk/tuktuk.icons.css']
+
+      js_core: [
+        'components/jquery/jquery.min.js',
+        'components/monocle/monocle.js',
+        'components/tuktuk/tuktuk.js']
+
+    coffee:
+      compile: files: '<%= meta.endpoint %>/<%= meta.file %>.debug.js': ['<%= source.coffee %>']
+
+    uglify:
+      options: compress: false, banner: "<%= meta.banner %>"
+      coffee: files: '<%= meta.endpoint %>/<%= meta.file %>.js': '<%= meta.endpoint %>/<%= meta.file %>.debug.js'
+      core: files: '<%= meta.endpoint %>/<%= meta.file %>.core.js': '<%= source.js_core %>'
+
+    stylus:
+      stylesheets:
+        options: compress: true
+        files: '<%= meta.endpoint %>/<%= meta.file %>.css': ['<%= source.stylesheets %>']
+
+    concat:
+      css:
+        src: ['<%= source.css_core %>'],
+        dest: '<%= meta.endpoint %>/<%= meta.file %>.core.css'
+
+    watch:
+      coffee:
+        files: ["<%= source.coffee %>"]
+        tasks: ["coffee"]
+      stylesheets:
+        files: ["<%= source.stylesheets %>"]
+        tasks: ["stylus"]
+      core:
+        files: ["<%= source.js_core %>", "<%= source.css_core %>"]
+        tasks: ["uglify:core", "concat"]
+
+
+  grunt.loadNpmTasks "grunt-contrib-coffee"
+  grunt.loadNpmTasks "grunt-contrib-uglify"
+  grunt.loadNpmTasks "grunt-contrib-stylus"
+  grunt.loadNpmTasks "grunt-contrib-concat"
+  grunt.loadNpmTasks "grunt-contrib-watch"
+
+  grunt.registerTask "default", ["coffee", "uglify", "stylus", "concat"]


Save the brain on subsubscribe too.

Save the brain on subsubscribe too.

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/usermindinc/hubot-github-pr-reporter.git/'


Change intro and end

Change intro and end

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/GregDesplaces/classe-1914.git/'


Try it with processs.cwd

Try it with processs.cwd

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/mantacode/ftoggle-cli.git/'


testfix

testfix

--- tests/no-regression.coffee
+++ tests/no-regression.coffee
@@ -211,6 +211,12 @@
                 done()

     describe "Try to create a document with accent", ->
+
+        after (done) ->
+            @note?.destroy =>
+                @err = null
+                @note = null
+                done()

         it "When I create a document with accents", (done) ->
             data = { "title": "cool note", "content": "new note éôß" }


Collaboration: Suspiciously added existence check.

--- client/ide/views/statusbar/avatarview.coffee
+++ client/ide/views/statusbar/avatarview.coffee
@@ -30,7 +30,7 @@
     { appManager } = KD.singletons
     { rtm }        = appManager.getFrontApp()
     { profile }    = @getData()
-    changes        = rtm.getFromModel("#{profile.nickname}Snapshot").values()
+    changes        = rtm.getFromModel("#{nickname}Snapshot")?.values() or []
     menuItems      = {}
     menuData       =
       terminals : []


Please take seriously the coffee

Please take seriously the coffee

Please write some test for the coffee version.
Completely unusable 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/weber/compound-ex4.git/'


Tests: Raise timeout for slave worker ready in slave handoffs

--- test/slave/handoffs.coffee
+++ test/slave/handoffs.coffee
@@ -154,8 +154,10 @@
                                 # connections that arrive before we have a loaded
                                 # worker. For the moment, simply make sure we have
                                 # one here
-                                s1rpc.request "ready", (err) ->
+                                s1rpc.request "ready", null, null, timeout:5000, (err) ->
                                     throw err if err
+
+                                    debug "s1 is ready with worker"

                                     done()


Twilio support for spiking

Twilio support for spiking

--- plugins/twilio/index.coffee
+++ plugins/twilio/index.coffee
@@ -4,9 +4,11 @@
   @receiveEvent: (config, event, callback) ->
     # Build the message
     message = "[#{event.project.name}] #{event.trigger.message}"
-    if event.error
+    if event.trigger.type == 'projectSpiking'
+      message += ": #{event.trigger.rate} exceptions/minute"
+    else if event.error
       message += ": #{event.error.exceptionClass} in #{event.error.context}"
-
+
     # Build the request
     params =
       From: config.fromNumber
@@ -25,4 +27,4 @@
       .end (res) ->
         callback(res.error)

-module.exports = Twilio+module.exports = Twilio


Server: add username length check helpers

--- servers/lib/server/handlers/api/helpers.coffee
+++ servers/lib/server/handlers/api/helpers.coffee
@@ -32,8 +32,29 @@
     return callback null

+
+isSuggestedUsernameLengthValid = (suggestedUsername) ->
+
+  if 4 <= suggestedUsername?.length <= 15
+  then yes
+  else no
+
+
+isUsernameLengthValid = (username) ->
+
+  { JUser } = koding.models
+  { minLength, maxLength } = JUser.getValidUsernameLengthRange()
+
+  if minLength <= username?.length <= maxLength
+  then yes
+  else no
+
+
+
 module.exports = {
   sendApiError
   sendApiResponse
+  isUsernameLengthValid
   checkApiTokenAvailability
+  isSuggestedUsernameLengthValid
 }


Small change

Small change

--- src/app.coffee
+++ src/app.coffee
@@ -103,7 +103,7 @@
             url = [protocol, server.address().address, ':', server.address().port, '/'].join('')
             chalk.enabled = true if @get('node_env') is 'development'
             console.log chalk.green('Server running at') + ' ' + chalk.green.underline url
-        if use_ssl is true
+        if use_ssl
             options =
                 key: fs.readFileSync path.join base_path, ssl_key_path or ssl_cert_path
                 cert: fs.readFileSync path.join base_path, ssl_cert_path


Update unit tests for new results array-like API.

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/'


Argh... @voxxit pushing me to use coffeescript...

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/petermblair/libemail.git/'


Teamwork: Added support for importing Github gist files.

--- client/Teamwork/Views/teamworkimporter.coffee
+++ client/Teamwork/Views/teamworkimporter.coffee
@@ -15,9 +15,15 @@
   parseUrl: ->
     extension      = FSItem.getFileExtension @url
     gitHubUrlRegex = /http(s)?:\/\/github.com/
+    gistUrlRegex   = /http(s)?:\/\/gist.github.com/
     isGitHubUrl    = gitHubUrlRegex.test @url
-
-    if isGitHubUrl and extension isnt "zip"
+    isGistUrl      = gistUrlRegex.test @url
+
+    if isGistUrl
+      gistId = @url.split("/").last
+      @url   = "https://gist.github.com/#{gistId}.git"
+      @cloneRepo()
+    else if isGitHubUrl and extension isnt "zip"
       if extension is "git" then @cloneRepo()
       else
         @url = "#{@url}.git" # convert Github url to git url


groups menu item commented out

groups menu item commented out

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/'


collaboration: nullify references before dispose

--- client/ide/lib/collaborationcontroller.coffee
+++ client/ide/lib/collaborationcontroller.coffee
@@ -256,6 +256,13 @@
     @myWatchMap        = refs.watchMap
     @mySnapshot        = refs.snapshot

+    @rtm.once 'RealtimeManagerDidDispose', =>
+      @participants      = null
+      @changes           = null
+      @permissions       = null
+      @broadcastMessages = null
+      @myWatchMap        = null
+      @mySnapshot        = null

   registerCollaborationSessionId: ->


create amazing event manager

create amazing event manager

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

--- src/utils/EventManager.coffee
+++ src/utils/EventManager.coffee
@@ -0,0 +1,29 @@
+# Global RottenFlesh event emitter
+# Just like your average event manager, but way better
+class Rotten.EventManager
+
+	# Current object event listeners
+	@listeners = {}
+
+
+	# Add an event listener
+	# @param {String} name Event name
+	# @param {Function} listener Callback handler
+	listen: (name, listener) ->
+		@listeners[name] = [] if @listeners[name] is null
+		if listener not in @listeners[name] then @listeners[name].push listener
+
+
+	# Fire an event & execute a callback
+	# @param {String} name Event name
+	# @param {Object} event The event object to pass to listener
+	fire: (name, event) ->
+		@listeners[name][listener] event for listener in @listeners[name]
+
+
+	# Mute an event listener
+	# @param {String} name Event name
+	# @param {Function} listener Callback to delete
+	mute: (name, listener) ->
+		index = listener in @listeners[name]
+		@listeners[name].splice listener, 1 if index >= 0


bring back patch information for editing an issue

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/mover-io/hubot-flow-ingredientz.git/'


Remove the add all, commit & push motion

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/demhydraz/til.git/'


payment: add payment workflow.

payment: add payment workflow.

error: pathspec 'client/Main/payment/workflow.coffee' did not match any file(s) known to git

--- client/Main/payment/workflow.coffee
+++ client/Main/payment/workflow.coffee
@@ -0,0 +1,39 @@
+class PaymentWorkflow extends KDController
+
+  @interval:
+    MONTH  : 'month'
+    YEAR   : 'year'
+
+  @subscription  :
+    FREE         : 'free'
+    HOBBYIST     : 'hobbyist'
+    DEVELOPER    : 'developer'
+    PROFESSIONAL : 'professional'
+
+  constructor: (options = {}, data) ->
+
+    KodingAppsController.appendHeadElements
+      identifier : "stripe"
+      items      : [
+        {
+          type   : 'script'
+          url    : "https://js.stripe.com/v2/"
+        }
+      ]
+
+    super options, data
+
+    @start()
+
+
+  start: ->
+
+    { name, price } = @getOptions()
+
+    modal = new PaymentModal
+      state          :
+        subscription : name
+        interval     : PaymentWorkflow.MONTH_INTERVAL
+        price        : price
+
+


added requests

added requests

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

--- app/models/requests.coffee
+++ app/models/requests.coffee
@@ -0,0 +1,14 @@
+americano = require 'americano-cozy'
+
+module.exports =
+
+    alarm:
+        all       : (doc) -> emit doc.title, doc
+        byDate    : (doc) -> emit new Date(doc.trigg), doc
+
+    event:
+        all       : (doc) -> emit doc.title, doc
+        byDate    : (doc) -> emit new Date(doc.start), doc
+
+    user:
+        all       : (doc) -> emit doc.title, doc


File column is parsed if available

File column is parsed if available

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/rafalprzywarski/test-status.git/'


Change mark colors, close #12

Change mark colors, close #12

--- project.coffee
+++ project.coffee
@@ -27,22 +27,22 @@
         type: Pinpoint
         value: 'penguin'
         label: translate 'div', 'choices.penguin'
-        color: 'cyan'
+        color: '#f90'
       }, {
         type: Pinpoint
         value: 'eggs'
         label: translate 'div', 'choices.eggs'
-        color: 'magenta'
+        color: '#ff0'
       }, {
         type: Pinpoint
         value: 'chick'
         label: translate 'div', 'choices.chick'
-        color: 'yellow'
+        color: '#9f0'
       }, {
         type: Pinpoint
         value: 'other'
         label: translate 'div', 'choices.other'
-        color: 'black'
+        color: '#09f'
         details: [{
           type: 'radio'
           question: 'What is this?'


There's a gem for that!

There's a gem for that!

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

--- src/scripts/rubygems.coffee
+++ src/scripts/rubygems.coffee
@@ -0,0 +1,14 @@
+# Find a rubygem from rubygems.org
+#
+# hubot <there's a gem for> that - Returns a link to a gem on rubygems.org
+#
+
+module.exports = (robot) ->
+  robot.respond /there's a gem for (.*)/i, (msg) ->
+    search = escape(msg.match[1])
+    msg.http('https://rubygems.org/api/v1/search.json')
+      .query(query: search)
+      .get() (err, res, body) ->
+        results = JSON.parse(body)
+        result = results[0]
+        msg.send "https://rubygems.org/gems/#{result.name}"


S3 brain support!

S3 brain support!

 - Requires access key, secret key and brain path
 - Writes to S3 on a 30 min timer

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

--- src/scripts/s3-brain.coffee
+++ src/scripts/s3-brain.coffee
@@ -0,0 +1,103 @@
+# Description:
+#   Stores the brain in Amazon S3
+#
+# Dependencies:
+#   "aws2js": "0.7.10"
+#
+# Configuration:
+#   HUBOT_S3_BRAIN_ACCESS_KEY_ID
+#   HUBOT_S3_BRAIN_SECRET_ACCESS_KEY
+#   HUBOT_S3_BRAIN_BUCKET
+#
+# Commands:
+#
+# Notes:
+#   It's highly recommended to use an IAM account explicitly for this purpose
+#   https://console.aws.amazon.com/iam/home?
+#   A sample S3 policy for a bucket named Hubot-Bucket would be
+#   {
+#      "Statement": [
+#        {
+#          "Action": [
+#            "s3:DeleteObject",
+#            "s3:DeleteObjectVersion",
+#            "s3:GetObject",
+#            "s3:GetObjectAcl",
+#            "s3:GetObjectVersion",
+#            "s3:GetObjectVersionAcl",
+#            "s3:PutObject",
+#            "s3:PutObjectAcl",
+#            "s3:PutObjectVersionAcl"
+#          ],
+#          "Effect": "Allow",
+#          "Resource": [
+#            "arn:aws:s3:::Hubot-Bucket/brain-dump.json"
+#          ]
+#        }
+#      ]
+#    }
+#
+# Author:
+#   Iristyle
+
+util  = require 'util'
+aws   = require 'aws2js'
+
+# sets up hooks to persist the brain into redis.
+module.exports = (robot) ->
+
+  loaded            = false
+  key               = process.env.HUBOT_S3_BRAIN_ACCESS_KEY_ID
+  secret            = process.env.HUBOT_S3_BRAIN_SECRET_ACCESS_KEY
+  bucket            = process.env.HUBOT_S3_BRAIN_BUCKET
+  brain_dump_path   = "#{bucket}/brain-dump.json"
+
+  if !key && !secret && !bucket
+    throw new Error('S3 brain requires HUBOT_S3_BRAIN_ACCESS_KEY_ID, ' +
+      'HUBOT_S3_BRAIN_SECRET_ACCESS_KEY and HUBOT_S3_BRAIN_BUCKET configured')
+
+  s3 = aws.load('s3', key, secret)
+
+  store_brain = (brain_data, callback) ->
+    if !loaded
+      robot.logger.debug 'Not saving to S3, because not loaded yet'
+      return
+
+    buffer = new Buffer(JSON.stringify(brain_data))
+    headers =
+      'Content-Type': 'application/json'
+
+    s3.putBuffer brain_dump_path, buffer, 'private', headers, (err, response) ->
+      if err
+        robot.logger.error util.inspect(err)
+      else if response
+        robot.logger.debug "Saved brain to S3 path #{brain_dump_path}"
+
+      if callback then callback(err, response)
+
+  store_current_brain = () ->
+    store_brain robot.brain.data
+
+  # 30 minute timer based save to limit s3 PUT requests
+  time = 30 * 60 * 1000
+  intervalId = setInterval store_current_brain, time
+
+  s3.get brain_dump_path, 'buffer', (err, response) ->
+    # unfortunately S3 gives us a 403 if we have access denied OR
+    # the file is simply missing, so no way of knowing if IAM policy is bad
+    save_handler = (e, r) ->
+      if e then throw new Error("Error contacting S3:\n#{util.inspect(e)}")
+
+    # try to store an empty placeholder to see if IAM settings are valid
+    if err then store_brain {}, save_handler
+
+    if response && response.buffer
+      robot.brain.mergeData JSON.parse(response.buffer.toString())
+
+  robot.brain.on 'loaded', () ->
+    loaded = true
+    store_current_brain()
+
+  robot.brain.on 'close', ->
+    clearInterval intervalId
+    store_current_brain()


All REST validation errors are shown in a form #47

error: pathspec 'wzk/ui/form/ErrorNotifier.coffee' did not match any file(s) known to git

--- wzk/ui/form/ErrorNotifier.coffee
+++ wzk/ui/form/ErrorNotifier.coffee
@@ -0,0 +1,79 @@
+goog.provide 'wzk.ui.form.ErrorNotifier'
+
+goog.require 'wzk.ui.form.ErrorMessage'
+goog.require 'goog.object'
+goog.require 'goog.style'
+
+class wzk.ui.form.ErrorNotifier
+
+  ###*
+    @constructor
+    @param {wzk.dom.Dom} dom
+    @param {HTMLFormElement} form
+  ###
+  constructor: (@dom, @form) ->
+    @errors = {}
+
+  ###*
+    @param {Object.<string, string>} errors
+  ###
+  notify: (errors) ->
+    for field, err of errors
+      @showError err, field
+
+    @hidePrevErrors errors
+    @scrollToFirstError errors
+
+  ###*
+    Tries scroll to first error
+
+    @protected
+    @param {Object.<string, string>} errors
+  ###
+  scrollToFirstError: (errors) ->
+    return if goog.object.isEmpty errors
+
+    field = goog.object.getAnyKey errors
+    input = @getInput String(field)
+    if input?
+      goog.style.scrollIntoContainerView input, @dom.getElementByClass 'main-block-inner'
+
+  ###*
+    @protected
+    @param {string} err
+    @param {string} field
+  ###
+  showError: (err, field) ->
+    @getErrorMessage(field).showMessage err
+
+  hideAll: ->
+    err.hideMessage() for key, err of @errors
+
+  ###*
+    @protected
+    @param {Object.<string, string>} errorsToShow
+  ###
+  hidePrevErrors: (errorsToShow) ->
+    for key in goog.object.getKeys @errors
+      @errors[key].hideMessage() unless goog.object.containsKey errorsToShow, key
+
+  ###*
+    @protected
+    @param {string} id
+    @return {Element}
+  ###
+  getInput: (id) ->
+    @form.querySelector "#id_#{id}"
+
+  ###*
+    @protected
+    @param {string} field
+    @return {wzk.ui.form.ErrorMessage}
+  ###
+  getErrorMessage: (field) ->
+    unless goog.object.containsKey @errors, field
+      input = @getInput field
+      msg = new wzk.ui.form.ErrorMessage dom: @dom
+      msg.renderAfter input
+      @errors[field] = msg
+    @errors[field]


Sanitize candidate email prior to validation


unit tests for ResourceStateManager

unit tests for ResourceStateManager

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

--- test/unit/coffee/ResourceStateManagerTests.coffee
+++ test/unit/coffee/ResourceStateManagerTests.coffee
@@ -0,0 +1,124 @@
+SandboxedModule = require('sandboxed-module')
+sinon = require('sinon')
+should = require('chai').should()
+modulePath = require('path').join __dirname, '../../../app/js/ResourceStateManager'
+Path = require "path"
+Errors = require "../../../app/js/Errors"
+
+describe "ResourceStateManager", ->
+	beforeEach ->
+		@ResourceStateManager = SandboxedModule.require modulePath, requires:
+			"fs": @fs = {}
+			"logger-sharelatex": {log: sinon.stub(), err: sinon.stub()}
+			"./SafeReader": @SafeReader = {}
+		@basePath = "/path/to/write/files/to"
+		@resources = [
+			{path: "resource-1-mock"}
+			{path: "resource-2-mock"}
+			{path: "resource-3-mock"}
+		]
+		@state = "1234567890"
+		@resourceFileName = "#{@basePath}/.project-sync-state"
+		@resourceFileContents = "#{@resources[0].path}\n#{@resources[1].path}\n#{@resources[2].path}\nstateHash:#{@state}"
+		@callback = sinon.stub()
+
+	describe "saveProjectState", ->
+		beforeEach ->
+			@fs.writeFile = sinon.stub().callsArg(2)
+
+		describe "when the state is specified", ->
+			beforeEach ->
+				@ResourceStateManager.saveProjectState(@state, @resources, @basePath, @callback)
+
+			it "should write the resource list to disk", ->
+				@fs.writeFile
+					.calledWith(@resourceFileName, @resourceFileContents)
+					.should.equal true
+
+			it "should call the callback", ->
+				@callback.called.should.equal true
+
+		describe "when the state is undefined", ->
+			beforeEach ->
+				@state = undefined
+				@fs.unlink = sinon.stub().callsArg(1)
+				@ResourceStateManager.saveProjectState(@state, @resources, @basePath, @callback)
+
+			it "should unlink the resource file", ->
+				@fs.unlink
+					.calledWith(@resourceFileName)
+					.should.equal true
+
+			it "should not write the resource list to disk", ->
+				@fs.writeFile.called.should.equal false
+
+			it "should call the callback", ->
+				@callback.called.should.equal true
+
+	describe "checkProjectStateMatches", ->
+
+		describe "when the state matches", ->
+			beforeEach ->
+				@SafeReader.readFile = sinon.stub().callsArgWith(3, null, @resourceFileContents)
+				@ResourceStateManager.checkProjectStateMatches(@state, @basePath, @callback)
+
+			it "should read the resource file", ->
+				@SafeReader.readFile
+					.calledWith(@resourceFileName)
+					.should.equal true
+
+			it "should call the callback with the results", ->
+				@callback.calledWithMatch(null, @resources).should.equal true
+
+		describe "when the state does not match", ->
+			beforeEach ->
+				@SafeReader.readFile = sinon.stub().callsArgWith(3, null, @resourceFileContents)
+				@ResourceStateManager.checkProjectStateMatches("not-the-original-state", @basePath, @callback)
+
+			it "should call the callback with an error", ->
+				error = new Errors.FilesOutOfSyncError("invalid state for incremental update")
+				@callback.calledWith(error).should.equal true
+
+	describe "checkResourceFiles", ->
+		describe "when all the files are present", ->
+			beforeEach ->
+				@allFiles = [ @resources[0].path, @resources[1].path, @resources[2].path]
+				@ResourceStateManager.checkResourceFiles(@resources, @allFiles, @basePath, @callback)
+
+			it "should call the callback", ->
+				@callback.calledWithExactly().should.equal true
+
+		describe "when there is a file missing from the outputFileFinder but present on disk", ->
+			beforeEach ->
+				@allFiles = [ @resources[0].path, @resources[1].path]
+				@fs.stat = sinon.stub().callsArg(1)
+				@ResourceStateManager.checkResourceFiles(@resources, @allFiles, @basePath, @callback)
+
+			it "should stat the file to see if it is present", ->
+				@fs.stat.called.should.equal true
+
+			it "should call the callback", ->
+				@callback.calledWithExactly().should.equal true
+
+		describe "when there is a missing file", ->
+			beforeEach ->
+				@allFiles = [ @resources[0].path, @resources[1].path]
+				@fs.stat = sinon.stub().callsArgWith(1, new Error())
+				@ResourceStateManager.checkResourceFiles(@resources, @allFiles, @basePath, @callback)
+
+			it "should stat the file to see if it is present", ->
+				@fs.stat.called.should.equal true
+
+			it "should call the callback with an error", ->
+				error = new Errors.FilesOutOfSyncError("resource files missing in incremental update")
+				@callback.calledWith(error).should.equal true
+
+		describe "when a resource contains a relative path", ->
+			beforeEach ->
+				@resources[0].path = "../foo/bar.tex"
+				@allFiles = [ @resources[0].path, @resources[1].path, @resources[2].path]
+				@ResourceStateManager.checkResourceFiles(@resources, @allFiles, @basePath, @callback)
+
+			it "should call the callback with an error", ->
+				@callback.calledWith(new Error("relative path in resource file list")).should.equal true
+


created multiloader

created multiloader

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/airtonix/gastropod.git/'


Replace union with concat for perf

Replace union with concat for perf

--- SingularityUI/app/collections/LogLines.coffee
+++ SingularityUI/app/collections/LogLines.coffee
@@ -224,7 +224,7 @@

     # Merge an array of multiple LogLines collections ordered by timestamp
     @merge: (collections) ->
-      collection =  _.union.apply @, collections
+      collection = [].concat.apply [], collections
       collection = collection.sort (a, b) =>
         if a.timestamp and b.timestamp and !a.timestamp.isSame(b.timestamp)
           return if a.timestamp.isBefore(b.timestamp) then -1 else 1


add a longer timeout to avoid spurious failures

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 paging

add paging

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/nanapi/taki.git/'


Made right-click duplicate Thang menu actually clone modified Thang.

--- app/views/editor/level/thangs_tab_view.coffee
+++ app/views/editor/level/thangs_tab_view.coffee
@@ -69,7 +69,7 @@
     @level = options.level

     $(document).bind 'contextmenu', @preventDefaultContextMenu
-
+
   getRenderData: (context={}) ->
     context = super(context)
     return context unless @supermodel.finished()
@@ -102,7 +102,7 @@
       $('#thangs-list').height(oldHeight - thangsHeaderHeight - 40)
     else
       $('#thangs-list').height(oldHeight - thangsHeaderHeight - 80)
-
+

   afterRender: ->
     super()
@@ -440,18 +440,15 @@

   onDuplicateClicked: (e) ->
     $('#contextmenu').hide()
-    if !@addThangType
-      thang = @selectedExtantThang.spriteName
-      e.target = $(".add-thang-palette-icon[data-thang-type='" + thang + "']").get 0
-    @selectAddThang e
-
+    @selectAddThangType @selectedExtantThang.spriteName, @selectedExtantThang
+
   toggleThangsContainer: (e) ->
     $('#all-thangs').toggle()
-
+
   toggleThangsPalette: (e) ->
     $('#add-thangs-column').toggle()
     @onWindowResize e
-
+

 class ThangsNode extends TreemaNode.nodeMap.array
   valueClass: 'treema-array-replacement'


do not process messages from REST as bot

--- packages/rocketchat-api/server/routes.coffee
+++ packages/rocketchat-api/server/routes.coffee
@@ -55,9 +55,6 @@
 RocketChat.API.v1.addRoute 'chat.postMessage', authRequired: true,
 	post: ->
 		try
-			@bodyParams.bot =
-				u: @userId
-
 			messageReturn = processWebhookMessage @bodyParams, @user

 			if not messageReturn?


Add check for message.html

Add check for message.html

--- packages/rocketchat-markdown/markdown.coffee
+++ packages/rocketchat-markdown/markdown.coffee
@@ -8,7 +8,7 @@
 		msg = message

 		if not _.isString message
-			if _.trim message.html
+			if _.trim message?.html
 				msg = message.html
 			else
 				return message


Kite : create new helper while registering kite singleton


collaboration: controller minor

collaboration: controller minor


backslash error..

backslash error..

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/pcruise/translate-together.git/'


Started utility method foundation; shared commonly useful methods; a work in progress

error: pathspec 'js/core/util/util_methods/util_methods.coffee' did not match any file(s) known to git

--- js/core/util/util_methods/util_methods.coffee
+++ js/core/util/util_methods/util_methods.coffee
@@ -0,0 +1,103 @@
+UtilMethods = HClass.extend
+
+  arrIncludes: (_arr,_what)->
+    _arr.indexOf(_what) != -1
+
+  # List of primitive object type's chars
+  _builtinTypeChr: [
+    'b' # boolean
+    'n' # number
+    's' # string
+  ]
+
+  getValueById: (_id)->
+    COMM.Values.values[_id]
+
+  ###
+  # Returns object type as a single-char string.
+  # Use this method to detect the type of the object given.
+  #
+  # Returns the type of the object given as a character code. Returns false,
+  # if unknown or unsupported objcet type.
+  #
+  # Returns:
+  # _One of the following:_
+  # - 'a': Array
+  # - 'h': Hash (Generic Object)
+  # - 'd': Date
+  # - 'b': Boolean (true/false)
+  # - 'n': Number (integers and floats)
+  # - 's': String
+  # - '~': Null
+  # - '-': Undefined
+  # - false: unknown
+  ###
+  typeChr: (_obj)->
+    return '-' unless _obj?
+    return '~' if _obj == null
+    _typeChr = (typeof _obj).slice(0,1)
+    return _typeChr if @arrIncludes(@_builtinTypeChr,_typeChr)
+    if _typeChr == 'o'
+      return 'a' if _obj.constructor == Array
+      return 'h' if _obj.constructor == Object
+      return 'd' if _obj.constructor == Date
+    return false
+
+  baseStrToNum: (_str, _base)->
+    return null if 's' != @typeChr(_str)
+    _base = 10 unless _base?
+    parseInt(_str, _base)
+
+  baseNumToStr: (_num, _base)->
+    return null if 'n' != @typeChr(_num)
+    _base = 10 unless _base?
+    _num.toString(_base)
+
+  hexToNum: (_hex)->
+    @baseStrToNum(_hex,16)
+
+  numToHex: (_int)->
+    @baseNumToStr(_int,16)
+
+  base36ToNum: (_base36)->
+    @baseStrToNum(_base36,36)
+
+  numToBase36: (_num)->
+    @baseIntToStr(_num,36)
+
+  _hexColorLengths: [3,4,6,7]
+  _hexCharacters: ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
+  _hex3To6Ratio: 4097 # parseInt('1001',16)
+  _normalizeHexColorToNum: (_color)->
+    return null if @typeChr(_color) != 's'
+    _hexLen = _color.length
+    return null unless @arrIncludes(@_hexColorLengths,_hexLen)
+    _color = _color.toLowerCase()
+    _str = ''
+    for _chr, i in _color.split('')
+      continue if i == 0 and _chr == '#' and ( _hexLen == 4 or _hexLen == 7 )
+      return null unless @arrIncludes( @_hexCharacters, _chr )
+      _str += _chr
+    _num = @hexToNum( _str )
+    _num = 0 if _num < 0
+    _num = 16777215 if _num > 16777215
+    _num = _num*@_hex3To6Ratio if _hexLen < 6
+    return _num
+  _normalizeNumToHexColor: (_num)->
+    _num = 0 if _num < 0
+    _num = 16777215 if _num > 16777215
+    _str = @numToHex(_num)
+    _str = '0'+_str until _str.length == 6
+    return '#'+_str
+
+  hexColorAdd: (_hex1,_hex2)->
+    @_normalizeNumToHexColor(
+      @_normalizeHexColorToNum(_hex1) +
+      @_normalizeHexColorToNum(_hex2)
+    )
+
+  hexColorSubtract: (_hex1,_hex2)->
+    @_normalizeNumToHexColor(
+      @_normalizeHexColorToNum(_hex1) -
+      @_normalizeHexColorToNum(_hex2)
+    )


Table creation modal respects durability

--- admin/static/coffee/modals.coffee
+++ admin/static/coffee/modals.coffee
@@ -191,9 +191,9 @@
         else
             # TODO Add durability in the query when the API will be available
             if @formdata.write_disk is 'yes'
+                durability = 'hard'
+            else
                 durability = 'soft'
-            else
-                durability = 'hard'

             if @formdata.primary_key isnt ''
                 primary_key = @formdata.primary_key
@@ -213,6 +213,7 @@
                             db: @db_name
                             name: @formdata.name
                             primary_key: primary_key
+                            durability
                             shards: [
                                 primary_replica: server
                                 replicas: [server]


Added default user type

Added default user type

Added default user type and set it in the database at registration.

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/C-Bouthoorn/Anthony-Server.git/'


Add promises marking when the containing body is in various stages of completion

error: pathspec 'app/js/jail_iframe/classes/ready_promise.coffee' did not match any file(s) known to git

--- app/js/jail_iframe/classes/ready_promise.coffee
+++ app/js/jail_iframe/classes/ready_promise.coffee
@@ -0,0 +1,26 @@
+ready = $.Deferred()
+complete = $.Deferred()
+
+if /^(interactive|complete)$/.test(document.readyState)
+  ready.resolve()
+else
+  document.addEventListener('DOMContentLoaded', -> ready.resolve())
+
+if 'complete' == document.readyState
+  complete.resolve()
+else
+  console.log "queuing handler since we're in state #{document.readyState}"
+  window.addEventListener('load', -> complete.resolve())
+
+console.log document.readyState
+
+FactlinkJailRoot.ready_promise = ready.promise()
+FactlinkJailRoot.load_promise = complete.promise()
+
+FactlinkJailRoot.ready_promise.done -> console.log 'AAAAAAAAAAAAAAAA'
+FactlinkJailRoot.load_promise.done -> console.log 'BBBBBBBBBBBBBBBB'
+
+
+FactlinkJailRoot.ready_promise
+  .then( -> FactlinkJailRoot.delay 4000)
+  .then( -> console.log("final state #{document.readyState}"))


fetch widget templates from API v1 and v2

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/xaun/impac-angular.git/'


Temporary fix for emojis not showing

Temporary fix for emojis not showing

--- packages/rocketchat-lib/lib/callbacks.coffee
+++ packages/rocketchat-lib/lib/callbacks.coffee
@@ -29,9 +29,9 @@
 	RocketChat.callbacks[hook] ?= []

 	# Avoid adding the same callback twice
-	for cb in RocketChat.callbacks[hook]
-		if cb.name is callback.name
-			return
+	# for cb in RocketChat.callbacks[hook]
+	# 	if cb.name is callback.name
+	# 		return

 	RocketChat.callbacks[hook].push callback
 	return


enabling deleting redis groups that dont exist in aws

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/'


Add placehholder spec file

Add placehholder spec file


Activity/Flux: use getChannelTypeByName util

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/'


Refactoring tooltip plugin again

Refactoring tooltip plugin again

error: pathspec 'vendor/assets/javascripts/mice/tooltip.coffee' did not match any file(s) known to git

--- vendor/assets/javascripts/mice/tooltip.coffee
+++ vendor/assets/javascripts/mice/tooltip.coffee
@@ -0,0 +1,117 @@
+# Mice: tooltip
+
+# Inspired by the original jQuery.tipsy by Jason Frame
+# https://github.com/jaz303/tipsy
+
+# Copyright (c) 2014 Miclle
+# Licensed under MIT (https://github.com/miclle/mice/blob/master/LICENSE)
+
+'use strict';
+
+(($) ->
+
+  # TOOLTIP PUBLIC CLASS DEFINITION
+
+  class Tooltip
+    constructor: (element, options) ->
+      @type
+      @options
+      @enabled
+      @timeout
+      @hoverState
+      @$element   = null
+
+      @init('tooltip', element, options)
+
+
+    init: (type, element, options) ->
+      @enabled  = true
+      @type     = type
+      @$element = $(element)
+      @options  = @options.viewport and $(@options.viewport.selector or @options.viewport)
+
+      for trigger in @options.trigger.split(' ')
+        if trigger == 'click'
+          @$element.on('click.' + @type, @options.selector, $.proxy(@toggle, @))
+        else if trigger != 'manual'
+          eventIn  = if trigger == 'hover' then 'mouseenter' else 'focusin'
+          eventOut = if trigger == 'hover' then 'mouseleave' else 'focusout'
+
+          @$element.on((eventIn)  + '.' + @type, @options.selector, $.proxy(@enter, @))
+          @$element.on((eventOut) + '.' + @type, @options.selector, $.proxy(@leave, @))
+
+      if @options.selector
+        @_options = $.extend({}, @options, { trigger: 'manual', selector: '' })
+      else
+        @fixTitle()
+
+      return
+
+    getDefault: ->
+      $.fn.tooltip.defaults
+
+    getOptions: (options) ->
+      options = $.extend({}, @getDefaults(), @$element.data(), options)
+      options.delay = show: options.delay, hide: options.delay if options.delay and typeof options.delay == 'number'
+      options
+
+    getDelegateOptions: ->
+      options  = {}
+      defaults = @getDefaults()
+
+      @_options and $.each @_options, (key, value) ->
+        options[key] = value if defaults[key] != value
+
+      options
+
+    enter: (obj) ->
+      self = if obj instanceof this.constructor then obj else $(obj.currentTarget).data('bs.' + @type)
+
+      if !self
+        self = new @constructor(obj.currentTarget, @getDelegateOptions())
+        $(obj.currentTarget).data('bs.' + @type, self)
+
+      clearTimeout(@timeout)
+
+      self.hoverState = 'in'
+
+      return self.show() if !self.options.delay or !self.options.delay.show
+
+      self.timeout = setTimeout (-> self.show() if self.hoverState == 'in') , self.options.delay.show
+
+    leave: (obj) ->
+      self = if obj instanceof this.constructor then obj else $(obj.currentTarget).data('bs.' + @type)
+
+      if !self
+        self = new this.constructor(obj.currentTarget, @getDelegateOptions())
+        $(obj.currentTarget).data('bs.' + @type, self)
+
+      clearTimeout(self.timeout)
+
+      self.hoverState = 'out'
+
+      return self.hide() if !self.options.delay or !self.options.delay.hide
+
+      self.timeout = setTimeout (-> self.hide() if self.hoverState == 'out') , self.options.delay.hide
+
+  $.fn.tooltip = (options) ->
+    @.each ->
+
+
+  $.fn.tooltip.defaults =
+    animation: true
+    placement: 'top'
+    selector: false
+    template: '

'
+    trigger: 'hover focus'
+    title: ''
+    delay: 0
+    html: false
+    container: false
+    viewport:
+      selector: 'body'
+      padding: 0
+
+  return
+
+) jQuery


whoops

whoops

--- src/atom/extension-manager.coffee
+++ src/atom/extension-manager.coffee
@@ -7,7 +7,7 @@
   constructor: ->
     atom.on 'window:load', @loadExtensions

-  loadExtensions: ->
+  loadExtensions: =>
     extension.shutdown() for name, extension of @extensions
     @extensions = {}


got rid of speedr.equals

got rid of speedr.equals

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/genericdave/speedr.js.git/'


add dns-template config

add dns-template config

error: pathspec 'dns-template/config.coffee' did not match any file(s) known to git

--- dns-template/config.coffee
+++ dns-template/config.coffee
@@ -0,0 +1,9 @@
+module.exports =
+  service: [
+    'oauth2.service.consul'
+    'mobile.service.consul'
+    'imsails.service.consul'
+    'healthcheck.service.consul'
+    'todo.service.consul'
+    'hotspot.service.consul'
+  ]


Add Chat.coffee

Add Chat.coffee

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

--- app/assets/javascripts/interaction_web_tools/chat.coffee
+++ app/assets/javascripts/interaction_web_tools/chat.coffee
@@ -0,0 +1,30 @@
+# TODO: set content-type for requests
+# TODO: refactor 'that' hack
+# TODO: create helper for rendering chat partial
+
+window.Chat = class Chat
+  #@EVENTS_PATH: 'interaction_web_tools/events'
+  @EVENTS_PATH: 'http://private-cf542-ininmessages.apiary-mock.com/events'
+  @MESSAGES_DIV: '.chat-messages'
+
+  constructor: ->
+
+  receiveMessages: ->
+    that = @
+    $.get @constructor.EVENTS_PATH, (data) ->
+      that.renderMessages data.events
+
+  sendMessage: (message) ->
+    that = @
+    $.post @constructor.EVENTS_PATH, { event: { content: message } }, (data) ->
+      that.renderMessages data.events
+
+  renderMessages: (messages) ->
+    messages = $.grep messages, (el) -> el.type == 'text'
+    that = @
+    $.each messages, (index, message) ->
+      $(that.constructor.MESSAGES_DIV).append(
+        "<div class='message-#{message.participant_type}'>
+         #{message.participant_type}: #{message.content}
+         </div>"
+      )


Added server code.

Added server code.

error: pathspec 'server.coffee' did not match any file(s) known to git

--- server.coffee
+++ server.coffee
@@ -0,0 +1,5 @@
+assert = null
+
+do ->
+  require = __meteor_bootstrap__.require
+  assert = require 'assert'


test sorting

test sorting

error: pathspec 'tutor/specs/components/scores/index.spec.cjsx' did not match any file(s) known to git

--- tutor/specs/components/scores/index.spec.cjsx
+++ tutor/specs/components/scores/index.spec.cjsx
@@ -0,0 +1,44 @@
+{React} = require '../helpers/component-testing'
+_ = require 'lodash'
+SnapShot = require 'react-test-renderer'
+
+EnzymeContext = require '../helpers/enzyme-context'
+
+COURSE = require '../../../api/user/courses/1.json'
+DATA = require   '../../../api/courses/1/performance.json'
+COURSE_ID = '1'
+Sorter = require '../../../src/components/scores/student-data-sorter'
+{ScoresActions} = require '../../../src/flux/scores'
+{CourseActions} = require '../../../src/flux/course'
+
+
+{Scores} = require '../../../src/components/scores/index'
+
+getStudentNames = (wrapper) ->
+  names = wrapper.find('.student-name').map (el) -> el.text()
+  names.slice(1)
+
+describe 'Scores Report', ->
+
+  beforeEach ->
+    @props = {
+      courseId: COURSE_ID
+      isConceptCoach: false
+    }
+    CourseActions.loaded(COURSE, COURSE_ID)
+    ScoresActions.loaded(DATA, COURSE_ID)
+
+  it 'renders', ->
+    wrapper = mount(<Scores {...@props} />, EnzymeContext.build())
+    expect(getStudentNames(wrapper)).to.deep.equal(_.map(DATA[0].students, 'name'))
+    undefined
+
+  it 'sorts', ->
+    wrapper = mount(<Scores {...@props} />, EnzymeContext.build())
+    wrapper.find('.header-cell.sortable').at(1).simulate('click')
+    sorter = Sorter(sort: {key: 0, dataType: 'score'}, displayAs: 'percentage')
+    sorted = _.sortBy(DATA[0].students, sorter).reverse()
+    expect(getStudentNames(wrapper)).to.deep.equal(_.map(sorted, 'name'))
+    wrapper.find('.header-cell.sortable').at(1).simulate('click')
+    expect(getStudentNames(wrapper)).to.deep.equal(_.map(sorted.reverse(), 'name'))
+    undefined


Added scoreboard navbar link

Added scoreboard navbar link

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/alpire/picoCTF-web.git/'


Add index Users status

Add index Users status

--- packages/rocketchat-lib/server/models/Users.coffee
+++ packages/rocketchat-lib/server/models/Users.coffee
@@ -5,6 +5,7 @@
 		@tryEnsureIndex { 'roles': 1 }, { sparse: 1 }
 		@tryEnsureIndex { 'name': 1 }
 		@tryEnsureIndex { 'lastLogin': 1 }
+		@tryEnsureIndex { 'status': 1 }

 	# FIND ONE


SC.stream doesn't reuse the soundmanager sound anymore

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/kidaa/soundcloud-javascript.git/'


add new scrollify plug-in to support vertical scrollers

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

--- src/ioiojs/scrollify.coffee
+++ src/ioiojs/scrollify.coffee
@@ -0,0 +1,52 @@
+$ = jQuery
+
+$ ->
+
+  # create a fake debug object if it doesn't exists.
+  debug = window.debug ?= { log: -> }
+
+  methods =
+    init: (options) ->
+
+      @each (index, item) ->
+
+        container = $( item )
+
+        #
+        scrollHeight = container.get(0).scrollHeight
+
+        # check if the area needs vertical scrolling
+        return if scrollHeight <= container.height()
+
+        # add the scrollbar container.
+        html = "

+

+

+               "
+        $( html )
+          .appendTo( container )
+
+        scroller = container.find( ".scrollbar.vertical .scroller" )
+
+        scroller
+          .draggable
+            axis: "y"
+            containment: "parent"
+            drag: (event, ui) ->
+              container.scrollTop ( container.get(0).scrollHeight - container.height() ) * ( ui.position.top / ( container.height() - scroller.height() ) )
+            start: ->
+              container.data
+                dragging: true
+            stop: ->
+              container.data
+                dragging: false
+
+        container.scroll (event) ->
+          return if container.data( "dragging" )
+          scroller.css( "top" , ( container.get(0).scrollHeight - scroller.height() ) * ( container.scrollTop() / ( container.get(0).scrollHeight - container.height() ) ) )
+
+  $.fn.scrollify = ( method ) ->
+    # Method calling logic
+    return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 )) if methods[method]?
+    return methods.init.apply( this, arguments ) if "object" is typeof method or not method?
+    $.error( "Method #{method} does not exist on scrollbars" )


Add KSS javascript to handle CSS pseudo classes

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

--- app/assets/javascripts/styleguide/kss.js.coffee
+++ app/assets/javascripts/styleguide/kss.js.coffee
@@ -0,0 +1,30 @@
+# Scans stylesheets for pseudo classes, then inserts a new CSS rule with the
+# same properties, but named 'psuedo-class-{{name}}'.
+#
+# Supported pseudo classes: hover, disabled, active, visited, focus, checked.
+#
+# Example:
+#
+#   a:hover { color: blue; }
+#   => a.pseudo-class-hover { color: blue; }
+
+pseudos = /(\:hover|\:disabled|\:active|\:visited|\:focus|\:checked)/g
+
+try
+  for stylesheet in document.styleSheets
+    idxs = []
+    for rule, idx in stylesheet.cssRules
+      if (rule.type == CSSRule.STYLE_RULE) && pseudos.test(rule.selectorText)
+        replaceRule = (matched, stuff) ->
+          return ".pseudo-class-" + matched.replace(':', '')
+        @insertRule(rule.cssText.replace(pseudos, replaceRule))
+
+insertRule: (rule) ->
+  headEl = document.getElementsByTagName('head')[0]
+  styleEl = document.createElement('style')
+  styleEl.type = 'text/css'
+  if styleEl.styleSheet
+    styleEl.styleSheet.cssText = rule
+  else
+    styleEl.appendChild(document.createTextNode(rule))
+  headEl.appendChild(styleEl)


Class game => coordonate button

Class game => coordonate 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/GregDesplaces/classe-1914.git/'


Remove     # ] invald fairs from art_fairs routes

--- src/mobile/apps/art_fairs/test/routes.coffee
+++ src/mobile/apps/art_fairs/test/routes.coffee
@@ -22,10 +22,6 @@
       fabricate('fair', profile: profile, id: _.uniqueId('past'), is_published: true, has_full_feature: true, has_listing: true, organizer: fabricate('fair_organizer'), end_at: moment().subtract(10, 'days'))
     @upcomingFairs = _.times 3, ->
       fabricate('fair', profile: unpublished_profile, id: _.uniqueId('upcoming'), is_published: true, has_full_feature: true, has_listing: true, organizer: null, end_at: moment().add(10, 'days'))
-    @invalidFairs = [
-      fabricate 'fair', id: _.uniqueId('invalid'), is_published: false
-      fabricate 'fair', id: _.uniqueId('invalid'), is_published: true, has_full_feature: false, has_listing: false
-    ]

   describe 'with fairs', ->

@@ -35,7 +31,6 @@
         @currentFairs
         @pastFairs
         @upcomingFairs
-        @invalidFairs
       ]
       routes.__set__ 'metaphysics', => Q.resolve { fairs: @fairs }


Allow running non-aluminum apps

Allow running non-aluminum apps

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/nathan/aluminum-cli.git/'


Fixed sounds spamming on last frame.

Fixed sounds spamming on last frame.

--- app/lib/surface/Surface.coffee
+++ app/lib/surface/Surface.coffee
@@ -497,13 +497,15 @@
     # seems to be a bug where only one object can register with the Ticker...
     oldFrame = @currentFrame
     oldWorldFrame = Math.floor oldFrame
+    lastFrame = @world.totalFrames - 1
     while true
       Dropper.tick()
       @trailmaster.tick() if @trailmaster
       # Skip some frame updates unless we're playing and not at end (or we haven't drawn much yet)
-      frameAdvanced = (@playing and @currentFrame < @world.totalFrames) or @totalFramesDrawn < 2
-      @currentFrame += @world.frameRate / @options.frameRate if frameAdvanced and @playing
-      @currentFrame = Math.min(@currentFrame, @world.totalFrames - 1)
+      frameAdvanced = (@playing and @currentFrame < lastFrame) or @totalFramesDrawn < 2
+      if frameAdvanced and @playing
+        @currentFrame += @world.frameRate / @options.frameRate
+        @currentFrame = Math.min @currentFrame, lastFrame
       newWorldFrame = Math.floor @currentFrame
       worldFrameAdvanced = newWorldFrame isnt oldWorldFrame
       if worldFrameAdvanced
@@ -513,6 +515,7 @@
       break unless Dropper.drop()
     if frameAdvanced and not worldFrameAdvanced
       # We didn't end the above loop on an integer frame, so do the world state update.
+      console.log "Restore world state"
       @restoreWorldState()

     # these are skipped for dropped frames


Coffeescript for basic checkbox selection

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

--- app/assets/javascripts/users/promote.js.coffee
+++ app/assets/javascripts/users/promote.js.coffee
@@ -0,0 +1,14 @@
+$(document).ready ->
+  $('.promote-table').on 'change', '#select-all', ->
+    if $(this).is(':checked')
+      $('.promote-select').prop 'checked', true
+    else
+      $('.promote-select').prop 'checked', false
+    return
+  $('.promote-table').on 'change', '.promote-select', ->
+    if $('.promote-select:checked').length == 0
+      $('#select-all').prop 'checked', false
+    else if $('.promote-select:checked').length == $('.promote-table').find('tbody > tr').length
+      $('#select-all').prop 'checked', true
+    return
+  return


Revert "remove ship it harder, cauise its broke"

This reverts commit ea10a8ac305648299dc564e06a3dbda3f8d76a97.

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

--- scripts/shipitharder.coffee
+++ scripts/shipitharder.coffee
@@ -0,0 +1,131 @@
+# Description:
+#   More Effective Rodent Motivation
+#
+#   Set the environment variable HUBOT_SHIP_EXTRA_CAPYBARAS (to anything)
+#   for additional motivation
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   HUBOT_SHIP_EXTRA_CAPYBARAS
+#
+# Commands:
+#   ship it harder - Display a motivational capybara when a squirrel just wont do!
+#
+# Original Author:
+#   maddox (capybaras added by DaveOps83)
+
+capybaras = [
+"http://www.rainforest-alliance.org/sites/default/files/uploads/4/capybara-family_15762686447_f9f8a0684a_o.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b01a3fd3d706c970b-800wi",
+"http://www.porfell.co.uk/assets/PICT0125.jpg",
+"http://www.rainforest-alliance.org/sites/default/files/styles/responsive_breakpoints_theme_rainforest_wide_1x/public/slideshow/header/capybara_0.jpg%253Fitok%253DG1uvWT23",
+"http://thumbs.media.smithsonianmag.com//filer/2e/73/2e738d22-a273-4a77-a76e-c5486b80c309/02_07_2014_capybara_monkey.jpg__800x600_q85_crop.jpg",
+"http://library.sandiegozoo.org/factsheets/capybara/images/capybara.jpg",
+"http://ak-hdl.buzzfed.com/static/enhanced/webdr05/2013/4/29/14/enhanced-buzz-5639-1367258753-0.jpg",
+"http://a-z-animals.com/media/animals/images/original/capybara3.jpg",
+"http://vignette4.wikia.nocookie.net/cookieclicker/images/2/24/Capybara-02.jpg/revision/latest%253Fcb%253D20130810045256",
+"http://a-z-animals.com/media/animals/images/original/capybara5.jpg",
+"https://upload.wikimedia.org/wikipedia/commons/7/70/Capybara_2.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b015433fc97e2970c-500wi",
+"https://upload.wikimedia.org/wikipedia/commons/8/85/Capybara_portrait.jpg",
+"http://a.dilcdn.com/bl/wp-content/uploads/sites/8/2013/05/025-624x616.jpg",
+"http://www.dallasnews.com/incoming/20130712-garl001.jpg.ece/BINARY/w595x467/garl001.JPG",
+"http://www.stlzoo.org/files/8813/0798/4082/capybara02.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b019b02308fe1970b-800wi",
+"http://animalfactguide.com/wp-content/uploads/2013/01/iStock_000001572797XSmall.jpg",
+"http://sauceio.com/wp-content/uploads/2013/12/capybaras.jpg",
+"http://i.imgur.com/PIbKpeE.jpg",
+"http://40.media.tumblr.com/f9c96eb10e9086bc26b3ec31cf6dc82a/tumblr_mx34xbtS9P1r38hk2o1_1280.jpg",
+"http://i.ytimg.com/vi/-lqhleCf8R0/maxresdefault.jpg",
+"http://api.ning.com/files/2r6NdP2wa8OTUiSd7GiXVIyYcSB3EPPcR5CA1OFCF1dYNwsJ1C9t70GiPI6UMgJSYC2swr7NEOLNSVpcHpnV-aCSThPQ3AAj/Capybarafamily.jpg%253Fwidth%253D720%2526height%253D480",
+"http://i.livescience.com/images/i/000/048/850/i02/capybara-02.jpg%253F1324347800",
+"http://38.media.tumblr.com/84ae77bbf9768f28b7e5494060702006/tumblr_inline_nagg7e01wf1rhuc3f.jpg",
+"https://upload.wikimedia.org/wikipedia/en/b/b4/Capybara_male.jpg",
+"https://capybaraworld.files.wordpress.com/2014/03/donguri-yawns-40-you-can-see-yasushi-behind-her-and-little-baby-io-in-the-background-40.jpg%253Fw%253D750%2526h%253D421",
+"http://jeffkreeftmeijer.com/images/capybaras.jpg",
+"http://www.dapcat.org/wp-content/uploads/2014/03/Capybara-And-Cat-Cat-Picture.jpg",
+"http://media.giphy.com/media/10FvIiZ8W67wNW/giphy.gif",
+"http://40.media.tumblr.com/b8516edadabe88195d7c971a3d6299b7/tumblr_n0q4ewMUyP1sutuwgo1_1280.jpg",
+"http://s3-static-ak.buzzfed.com/static/2014-01/campaign_images/webdr02/13/17/27-ways-the-capybara-is-the-life-of-the-party-1-3528-1389653760-35_big.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b019b02308ed6970b-800wi",
+"http://cdn2.arkive.org/media/82/82134A02-1C65-4051-878E-6A3BE12C9067/Presentation.Large/Portrait-of-infant-capybara.jpg",
+"http://40.media.tumblr.com/a54de0a2c94b8703fdfa988bbe130eb8/tumblr_mxuowa3OzO1sutuwgo1_1280.jpg",
+"http://a.dilcdn.com/bl/wp-content/uploads/sites/8/2013/05/147.jpg",
+"http://gianthamster.com/wp-content/uploads/2011/11/2009_04_18_02_CaplinPool_cropped.jpg",
+"http://gianthamster.com/wp-content/uploads/2013/07/2010_03_01_06_sCaplinMelanie.jpg",
+"http://media.mnn.com/assets/images/2015/04/pet-capybara.jpg",
+"https://capybaraworld.files.wordpress.com/2014/03/wn-scent-marking-capybara-straddling-plant-for-a-blog.jpg%253Fw%253D750%2526h%253D757",
+"http://i.dailymail.co.uk/i/pix/2014/02/03/article-2551095-1B2C322900000578-479_634x448.jpg",
+"http://40.media.tumblr.com/tumblr_m22m5htGGG1rtoixio1_500.jpg",
+"http://ngm.nationalgeographic.com/u/TvyamNb-BivtNwcoxtkc5xGBuGkIMh_nj4UJHQKuor8ESQ8FbgLInpSev4L5ezzHLXWAqUhznzvyNA/",
+"https://capybaraworld.files.wordpress.com/2014/04/20-of-romeo-one-of-the-worlds-great-leaders-april-4-2014-014.jpg%253Fw%253D750",
+"http://ak-hdl.buzzfed.com/static/2014-01/enhanced/webdr02/13/12/enhanced-buzz-19448-1389632861-30.jpg",
+"http://cdn0.lostateminor.com/wp-content/uploads/2015/02/Capybaras2.jpg",
+"http://i.dailymail.co.uk/i/pix/2013/06/21/article-2345934-1A6F477E000005DC-563_634x476.jpg",
+"https://media1.giphy.com/media/FvYUkjxRe2U0M/200_s.gif",
+"https://s-media-cache-ak0.pinimg.com/originals/d4/fa/e7/d4fae720ba3c18eff30a8acfc4ac0665.jpg",
+"http://40.media.tumblr.com/0dd167c95dc41206806d9b351c24974c/tumblr_mvqnfd21oc1sutuwgo1_1280.jpg",
+"http://gianthamster.com/wp-content/uploads/2009/05/caplin_profile_pool.jpg",
+"http://ichef-1.bbci.co.uk/news/304/media/images/72748000/jpg/_72748973_capybara-6.jpg",
+"http://thescoopblog.dallasnewsblogs.com/files/2013/07/tumblr_mpe4io1Duy1r03kk7o1_500.jpg",
+"http://41.media.tumblr.com/0d6ca07e0c4d2520ca8822183fd5f3c4/tumblr_my6ghpdKje1sutuwgo1_1280.jpg",
+"http://i.huffpost.com/gen/1241701/thumbs/o-CHEESECAKE-CAPYBARA-PUPPIES-570.jpg%253F16",
+"http://media.mnn.com/assets/images/2015/04/big-capybara.jpg",
+"http://36.media.tumblr.com/0adcb1bb7f9d7ccdbdb2449a3106f047/tumblr_npmr9gPv7G1u6hbi4o1_1280.jpg",
+"https://capybaraworld.files.wordpress.com/2014/04/45-faq-io-5-months-old-male-eating-his-cecotropes-mother-donguri-is-always-near-him-keeping-an-eye-on-him-and-making-sure-he-does-not-get-into-trouble.jpg",
+"http://i.huffpost.com/gen/1241696/thumbs/o-CHEESECAKE-CAPYBARA-PUPPIES-570.jpg%253F16",
+"http://www.zooborns.com/.a/6a010535647bf3970b011570362ae4970b-pi",
+"http://i.dailymail.co.uk/i/pix/2013/06/21/article-2345934-1A6F45DC000005DC-1000_634x476.jpg",
+"https://pbs.twimg.com/media/B9_X-jQIIAEhpcR.jpg",
+"http://s3.amazonaws.com/appendixjournal-images/images/attachments/000/000/189/large/l-Capybara-with-tiny-monkeys-riding-on-its-back.jpg%253F1358735010",
+"http://animal-backgrounds.com/download/2171/640x960/crop/capybara-animal-wallpaper-640x960.jpg",
+"http://cdn2.arkive.org/media/EB/EB0B5A72-3E4F-4717-96D5-1FADB30732F2/Presentation.Large/Female-capybara-suckling-two-infants.jpg",
+"https://capybaraworld.files.wordpress.com/2014/03/yasushi-loves-to-be-petted-august-2012.jpg",
+"http://i.dailymail.co.uk/i/pix/2013/06/21/article-2345934-1A6F4453000005DC-902_634x448.jpg",
+"http://i.dailymail.co.uk/i/pix/2013/06/21/article-2345934-1A6F4666000005DC-175_634x424.jpg",
+"http://i.livescience.com/images/i/000/043/573/i02/CapybaraBaby_Web_11.29.11.jpg%253F1322695173",
+"http://i2.wp.com/www.kittyarmy.com/wp-content/uploads/2013/06/o-CAPYBARA-HUGS-CAT-570.jpg",
+"http://www.newquayzoo.org.uk/userfiles/animals/images/2007_04_ray_wiltshire_4.jpg%253Fw%253D900%2526h%253D500",
+"http://gianthamster.com/wp-content/uploads/2013/09/2013_09_25_11_sGariPool.jpg",
+"http://gianthamster.com/wp-content/uploads/2010/12/V188_sCapybara.jpg",
+"http://lovemeow.com/wp-content/uploads/2015/01/1476035_758673774204483_6795465395002341575_n.jpg",
+"http://ichef.bbci.co.uk/naturelibrary/images/ic/credit/640x395/c/ca/capybara/capybara_1.jpg",
+"http://a-z-animals.com/media/animals/images/original/capybara7.jpg",
+"https://capybaraworld.files.wordpress.com/2014/04/40-uploaded-blog-faqs-snapshot0-romeo-and-tuffn-play-fighting-february-2014-jpeg.jpg%253Fw%253D750",
+"https://capybaraworld.files.wordpress.com/2014/03/snapshot16-toku-mating-momiji-jpeg-40-september-1-2013.jpg%253Fw%253D750%2526h%253D421",
+"https://capybaraworld.files.wordpress.com/2012/09/046.jpg",
+"https://s-media-cache-ak0.pinimg.com/736x/c3/d7/c8/c3d7c84dcf02b06f4fd58d21d0385944.jpg",
+"http://therevscience.com/wp-content/uploads/2013/05/169158_10100718789077725_301237654_o.jpg",
+"https://s-media-cache-ak0.pinimg.com/236x/64/46/ac/6446acbfdef68815b8bb161b16e8fad3.jpg",
+"http://19mvmv3yn2qc2bdb912o1t2n.wpengine.netdna-cdn.com/science/files/2014/01/capybara-bird.jpg",
+"http://r.ddmcdn.com/s_f/o_1/APL/uploads/2015/02/Preposterous-Pets-Season-1-Lifts-Gary-the-Capybara-Put-the-Cute-In-Rodent-1423969398.jpg",
+"http://31.media.tumblr.com/0cb4ac7d09a4f71b38c068206965dd92/tumblr_inline_nkyk5gCgT61s6kzh8.jpg",
+"https://s-media-cache-ak0.pinimg.com/236x/0c/66/dd/0c66ddc6a19d251eb5886097b65bfd96.jpg",
+"http://3.bp.blogspot.com/-Lah2ype_5f8/UuLavIR0D3I/AAAAAAAAAQE/wjQXQjqeAZY/s1600/Capybara%252Bpet.jpg",
+"http://41.media.tumblr.com/929c4e6e7223de7da46bef10ff18824a/tumblr_mt1gf4wjWD1sutuwgo1_1280.jpg",
+"https://s-media-cache-ak0.pinimg.com/736x/92/2d/6d/922d6dd9dc12f8313effe73ab9037623.jpg",
+"http://gianthamster.com/wp-content/uploads/2012/12/2010_05_23_01_sCaplinSnarling.jpg",
+"http://www.godvine.com/pics/capybara/capybara4.jpg",
+"https://capybaraworld.files.wordpress.com/2013/10/061.jpg",
+"http://vignette2.wikia.nocookie.net/wierdnwildcreatures/images/0/04/Capybara_front.jpg/revision/latest%253Fcb%253D20131004015805",
+"http://osdoc.cogsci.nl/2.9/tutorials/img/capybara/meowing-capybara.png",
+"https://s-media-cache-ak0.pinimg.com/236x/d3/6f/63/d36f63315896c2f6a746e223324f3239.jpg",
+"http://www.zooborns.com/.a/6a010535647bf3970b019b02301b9a970c-800wi",
+"http://big.assets.huffingtonpost.com/joecap1.gif",
+"http://assets.nydailynews.com/polopoly_fs/1.1960909!/img/httpImage/image.jpg_gen/derivatives/gallery_1200/joejoe-capybara.jpg",
+"https://upload.wikimedia.org/wikipedia/commons/2/2c/Hydrochoeris_hydrochaeris_Zoo_Praha_2011-3.jpg",
+"http://gianthamster.com/wp-content/uploads/2010/02/2009_09_01_sCaplinPool.jpg"
+]
+
+module.exports = (robot) ->
+
+  # Enable a looser regex if environment variable is set
+  if process.env.HUBOT_SHIP_EXTRA_CAPYBARAS
+    regex = /ship(ping|z|s|ped)?\s*it\s*(the)?\s*hard(er|est)?/i
+  else
+    regex = /ship\s*it\s*harder/i
+
+  robot.hear regex, (msg) ->
+    msg.send msg.random capybaras


fixed an issue where the onBeforeUnload event handling of empty inputs would only work in Activity

--- client/Framework/core/KDWindowController.coffee
+++ client/Framework/core/KDWindowController.coffee
@@ -106,32 +106,30 @@
         for pane in @getSingleton('mainView').mainTabView.panes
           msg = no

-          # Checking the Activity widgets for non-reset Input Fields
-          if pane.getOptions().type is "content" and pane.getOptions().name is "Activity"
-
-              # This cssClass needs to be added to the KDInputView OR
-              # to the wrapper (for ace)
-              pane.data.$(".warn-on-unsaved-data").each (i,element) =>
-
-                checkForUnsavedData = (el)=>
-                  foundUnsavedData = no
-
-                  # ACE-specific content check
-                  $(el).find(".ace_editor div.ace_line > span").each (i,e)=>
-                    if $(e).text()
-                      foundUnsavedData = yes
-
-                  foundUnsavedData
-
-                # If the View is a KDInputview, we don"t need to look
-                # further than the .val(). For ACE and others, we call
-                # the checkForUnsavedData function above
-                if ($(element).hasClass("kdinput") and $(element).val() or checkForUnsavedData(element))
-                  msg = "You may lose some input that you filled in."
-
           # For open Tabs (apps, editors)
-          else if pane.getOptions().type is "application" and pane.getOptions().name isnt "New Tab"
+          if pane.getOptions().type is "application" and pane.getOptions().name isnt "New Tab"
             msg = "Please make sure that you saved all your work."
+
+          # This cssClass needs to be added to the KDInputView OR
+          # to the wrapper (for ace)
+          pane.data.$(".warn-on-unsaved-data").each (i,element) =>
+
+            checkForUnsavedData = (el)=>
+              foundUnsavedData = no
+
+              # ACE-specific content check
+              $(el).find(".ace_editor div.ace_line > span").each (i,e)=>
+                if $(e).text()
+                  foundUnsavedData = yes
+
+              foundUnsavedData
+
+            # If the View is a KDInputview, we don"t need to look
+            # further than the .val(). For ACE and others, we call
+            # the checkForUnsavedData function above
+            if ($(element).hasClass("kdinput") and $(element).val() or checkForUnsavedData(element))
+              msg = "You may lose some input that you filled in."
+

       if msg # has to be created in the above checks
         event or= window.event


Client: Activity: Feed: Updated onEnter method of singleMessage to check if postId is any resultState or not


Ensure slash command parameters are defined (#4668)

--- packages/rocketchat-ui/lib/chatMessages.coffee
+++ packages/rocketchat-ui/lib/chatMessages.coffee
@@ -180,7 +180,7 @@
 						if RocketChat.slashCommands.commands[match[1]]
 							commandOptions = RocketChat.slashCommands.commands[match[1]]
 							command = match[1]
-							param = match[2]
+							param = if match[2]? then match[2] else ''
 							if commandOptions.clientOnly
 								commandOptions.callback(command, param, msgObject)
 							else


Only generate the tree with `updateRoot` in the TreeView

--- src/extensions/tree-view/src/tree-view.coffee
+++ src/extensions/tree-view/src/tree-view.coffee
@@ -27,9 +27,7 @@
     @instance.serialize()

   @content: (rootView) ->
-    @div class: 'tree-view tool-panel', tabindex: -1, =>
-      if rootView.project.getRootDirectory()
-        @subview 'root', new DirectoryView(directory: rootView.project.getRootDirectory(), isExpanded: true, project: rootView.project)
+    @div class: 'tree-view tool-panel', tabindex: -1

   @deserialize: (state, rootView) ->
     treeView = new TreeView(rootView)
@@ -67,7 +65,7 @@
     @rootView.command 'tree-view:reveal-active-file', => @revealActiveFile()
     @rootView.on 'active-editor-path-change', => @selectActiveFile()
     @rootView.project.on 'path-change', => @updateRoot()
-    config.observe 'core.hideGitIgnoredFiles', (value) => @updateRoot()
+    config.observe 'core.hideGitIgnoredFiles', => @updateRoot()

     @selectEntry(@root) if @root


remove double save

remove double save

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/nicgirault/cinelocal-admin.git/'


move models to their own file in preparation for complicated feed route

error: pathspec 'api/lib/models.coffee' did not match any file(s) known to git

--- api/lib/models.coffee
+++ api/lib/models.coffee
@@ -0,0 +1,23 @@
+mongoose = require 'mongoose'
+
+entrySchema = new mongoose.Schema
+  term:
+    type: String
+    required: true
+    unique: true
+  provider:
+    type: String
+    required: true
+
+module.exports.Entry = Entry = mongoose.model 'Entry', entrySchema
+
+tagSchema = new mongoose.Schema
+  term:
+    type: String
+    required: true
+    unique: true
+  provider:
+    type: String
+    required: true
+
+module.exports.Tag = Tag = mongoose.model 'Tag', tagSchema


Delete `TokenizedBuffer.prototype.buildPlaceholderTokenizedLinesForRows`

--- src/tokenized-buffer.coffee
+++ src/tokenized-buffer.coffee
@@ -120,7 +120,7 @@
   tokenizeNextChunk: ->
     # Short circuit null grammar which can just use the placeholder tokens
     if @grammar.name is 'Null Grammar' and @firstInvalidRow()?
-      @tokenizedLines = @buildPlaceholderTokenizedLinesForRows(0, @buffer.getLastRow())
+      @tokenizedLines = new Array(@buffer.getLineCount())
       @invalidRows = []
       @markTokenizationComplete()
       return
@@ -194,7 +194,8 @@
     @updateInvalidRows(start, end, delta)
     previousEndStack = @stackForRow(end) # used in spill detection below
     if @largeFileMode or @grammar.name is 'Null Grammar'
-      newTokenizedLines = @buildPlaceholderTokenizedLinesForRows(start, end + delta)
+      lineCount = ((end + delta) - start) + 1
+      newTokenizedLines = new Array(lineCount)
     else
       newTokenizedLines = @buildTokenizedLinesForRows(start, end + delta, @stackForRow(start - 1), @openScopesForRow(start))
     _.spliceWithArray(@tokenizedLines, start, end - start + 1, newTokenizedLines)
@@ -252,9 +253,6 @@
       @tokenizeInBackground()

     tokenizedLines
-
-  buildPlaceholderTokenizedLinesForRows: (startRow, endRow) ->
-    new Array(endRow - startRow + 1)

   buildTokenizedLineForRow: (row, ruleStack, openScopes) ->
     @buildTokenizedLineForRowWithText(row, @buffer.lineForRow(row), ruleStack, openScopes)


Path matching accepts '+' as a valid path element

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/rafalprzywarski/test-status.git/'


Tests for showing thread in course discussion (both loaded and not loaded)

error: pathspec 'common/static/coffee/spec/discussion/discussion_router_spec.coffee' did not match any file(s) known to git

--- common/static/coffee/spec/discussion/discussion_router_spec.coffee
+++ common/static/coffee/spec/discussion/discussion_router_spec.coffee
@@ -0,0 +1,189 @@
+describe 'DiscussionRouter', ->
+  beforeEach ->
+    DiscussionSpecHelper.setUpGlobals()
+    DiscussionSpecHelper.setUnderscoreFixtures()
+    appendSetFixtures("""
+
+      """)
+
+    @threads = [
+      DiscussionViewSpecHelper.makeThreadWithProps({
+        id: "1",
+        title: "Thread1",
+        votes: {up_count: '20'},
+        pinned: true,
+        comments_count: 1,
+        created_at: '2013-04-03T20:08:39Z',
+      }),
+      DiscussionViewSpecHelper.makeThreadWithProps({
+        id: "2",
+        title: "Thread2",
+        votes: {up_count: '42'},
+        comments_count: 2,
+        created_at: '2013-04-03T20:07:39Z',
+      }),
+      DiscussionViewSpecHelper.makeThreadWithProps({
+        id: "3",
+        title: "Thread3",
+        votes: {up_count: '12'},
+        comments_count: 3,
+        created_at: '2013-04-03T20:06:39Z',
+      }),
+      DiscussionViewSpecHelper.makeThreadWithProps({
+        id: "4",
+        title: "Thread4",
+        votes: {up_count: '25'},
+        comments_count: 0,
+        pinned: true,
+        created_at: '2013-04-03T20:05:39Z',
+      }),
+    ]
+
+    spyOn(DiscussionUtil, 'makeWmdEditor')
+    @discussion = new Discussion(_.map(@threads, (thread_spec) -> new Thread(thread_spec)), {pages: 2, sort: 'date'})
+    @course_settings = new DiscussionCourseSettings({
+          "category_map": {
+            "children": ["Topic", "General"],
+            "entries": {
+              "Topic": {"is_cohorted": false, "id": "topic"},
+              "General": {"is_cohorted": false, "id": "general"}
+            }
+          },
+          "allow_anonymous": false,
+          "allow_anonymous_to_peers": false,
+          "is_cohorted": true,
+          "cohorts": [
+            {"id": 1, "name": "Cohort1"},
+            {"id": 2, "name": "Cohort2"}
+          ]
+        })
+    @router = new DiscussionRouter({discussion: @discussion, course_settings: @course_settings})
+
+  describe 'showThread', ->
+    existingCheck = (thread_id) ->
+      it "shows thread #{thread_id}, which is already in threads collection", ->
+        DiscussionSpecHelper.makeAjaxSpy(() -> )
+        spyOn(@router, 'renderThreadView')
+        # precondition check - thread is in router's collection
+        expect(@router.discussion.get(thread_id)).not.toBeUndefined()
+        @router.showThread("irrelevant forum name", thread_id)
+        expect($.ajax).not.toHaveBeenCalled()
+        expect(@router.renderThreadView).toHaveBeenCalled()
+
+    missingCheck = (forum_name, thread_id) ->
+      it "requests thread #{thread_id} in forum #{forum_name} if not already in collection", ->
+
+        DiscussionSpecHelper.makeAjaxSpy(
+          (params) -> expect(params.url.path()).toBe(DiscussionUtil.urlFor('retrieve_single_thread', forum_name, thread_id))
+        )
+        spyOn(@router, 'renderThreadView')
+        # precondition check - thread is in router's collection
+        expect(@router.discussion.get(thread_id)).toBeUndefined()
+        @router.showThread(forum_name, thread_id)
+        # in this case showThread makes a hidden async ajax request - it's hard to hook inot it, so it's simpler and
+        # sufficient to just schedule assertion to run as soon as possible, but not immediately
+        setTimeout (() -> expect(@router.renderThreadView).toHaveBeenCalled()), 0
+
+
+    existingCheck('1')
+    existingCheck('2')
+    existingCheck('3')
+    existingCheck('4')
+
+    missingCheck('forum1', '12')
+    missingCheck('forum2', '15')
+    missingCheck('forum3', '112')
+


imports all models to cache worker

imports all models to cache worker

--- workers/cacher/index.coffee
+++ workers/cacher/index.coffee
@@ -14,11 +14,7 @@
   root         : __dirname
   mq           : new Broker mqOptions
   resourceName : cacheWorker.queueName
-  models       : [
-    '../social/lib/social/models/activity/cache.coffee'
-    '../social/lib/social/models/activity/index.coffee'
-    '../social/lib/social/models/messages'
-  ]
+  models       : '../social/lib/social/models'
 }

 {JActivityCache, CActivity} = koding.models


bugfix in settings module

bugfix in settings module

 On branch master
	modified:   nodejs_server/lib/settings.coffee

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/FireworksProject/platform.y.git/'


Client: upper case capitalize first letter of access

--- client/admin/lib/views/api/adminapiview.coffee
+++ client/admin/lib/views/api/adminapiview.coffee
@@ -21,7 +21,7 @@
   createSwitch: ->

     @addSubView @settingsView = new kd.CustomHTMLView
-      partial: 'Enable API access'
+      partial: 'Enable API Access'
       cssClass: 'settings-row'

     @settingsView.addSubView @apiSwitch = new KodingSwitch


client: remove getBlockquoteRanges util

client: remove getBlockquoteRanges util

Signed-off-by: Umut Sirin <4055abbc0e40a1254e715b952ccd414607e0b365@gmail.com>

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/'


Secure fetching activities request

Secure fetching activities request


reporting answers works now

reporting answers works now

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

--- app/assets/javascripts/answerbox/report.coffee
+++ app/assets/javascripts/answerbox/report.coffee
@@ -0,0 +1,18 @@
+$(document).on "click", "a[data-action=ab-report]", (ev) ->
+  ev.preventDefault()
+  if confirm 'Are you sure you want to report this answer?'
+    btn = $(this)
+    aid = btn[0].dataset.aId
+    $.ajax
+      url: '/ajax/report' # TODO: find a way to use rake routes instead of hardcoding them here
+      type: 'POST'
+      data:
+        id: aid
+        type: 'answer'
+      success: (data, status, jqxhr) ->
+        showNotification data.message, data.success
+      error: (jqxhr, status, error) ->
+        console.log jqxhr, status, error
+        showNotification "An error occurred, a developer should check the console for details", false
+      complete: (jqxhr, status) ->
+        btn.button "reset"


Created translator specs

Created translator specs

error: pathspec 'spec/coffeescripts/translator.spec.coffee' did not match any file(s) known to git

--- spec/coffeescripts/translator.spec.coffee
+++ spec/coffeescripts/translator.spec.coffee
@@ -0,0 +1,44 @@
+describe 'Translator Service', ->
+  translations =
+    normal: 'foo'
+    nested:
+      item: 'bar'
+    replace:
+      singular: 'foo is :bar'
+      multiple: 'foo is :bar but bar is :foo'
+      complex: 'foo is :abc but bar is :abcdef'
+      same: 'foo is :bar and bar is also :bar'
+      'same-array': 'lets count to 5, :foo :foo :foo :foo :foo'
+    plural:
+      basic: 'a foo|lots of foo'
+      exact: '{0} there are none|{3} there is a few|{10} there is max'
+      complex: '{0} none|[1,10] there is some|[25, Inf] there is lots'
+
+  translator = new Translator translations
+
+  describe 'retrieving', ->
+    it 'should retrieve a translation', ->
+      expect(translator.get('normal')).toEqual 'foo'
+
+    it 'should retrieve a nested translation', ->
+      expect(translator.get('nested.item')).toEqual 'bar'
+
+    it 'should return the translation key if unable to retrieve a translation', ->
+      expect(translator.get('normal.foo.bar')).toEqual 'normal.foo.bar'
+      expect(translator.get('replace.not_found', {bar: 'great'})).toEqual 'replace.not_found'
+
+  describe 'replacing', ->
+    it 'should replace a singular place-holder', ->
+      expect(translator.get('replace.singular', bar: 'great')).toEqual 'foo is great'
+
+    it 'should replace multiple place-holders', ->
+      expect(translator.get('replace.multiple', bar: 'great', foo: 'greator')).toEqual 'foo is great but bar is greator'
+
+    it 'should replace multiple place-holders of different lengths correcty', ->
+      expect(translator.get('replace.complex', abc: 'great', abcdef: 'greator')).toEqual 'foo is great but bar is greator'
+
+    it 'should replace a place-holder multiple times', ->
+      expect(translator.get('replace.same', {bar: 'great'})).toEqual 'foo is great and bar is also great'
+
+    it 'should replace the same place-holder multiple times with different data each time using an array', ->
+      expect(translator.get('replace.same-array', {foo: [1, 2, 3, 4, 5]})).toEqual 'lets count to 5, 1 2 3 4 5'


Add blank spec for CMS.Models.Week

Add blank spec for CMS.Models.Week

error: pathspec 'cms/static/coffee/spec/models/week_spec.coffee' did not match any file(s) known to git

--- cms/static/coffee/spec/models/week_spec.coffee
+++ cms/static/coffee/spec/models/week_spec.coffee
@@ -0,0 +1 @@
+describe "CMS.Models.Week", ->


recover home loader

recover home loader

--- app/coffee/app.coffee
+++ app/coffee/app.coffee
@@ -66,6 +66,7 @@
             access: {
                 requiresLogin: true
             },
+            loader: true,
             title: "HOME.PAGE_TITLE",
             description: "HOME.PAGE_DESCRIPTION",
         }


checking if user by juser.login

checking if user by juser.login


Prevent reviewing commits as author

Prevent reviewing commits as author

[#97001584]

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/review.git/'


Node Modules Koding: Jraphical: Module: remove oldStaticRemove implementation


adicionando customização do tooltip

adicionando customização do tooltip

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/AppCivico/votolegal-www.git/'


Fix quotes

Fix quotes

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/VilkkuV/codecombat.git/'


Get all projects test fail

Get all projects test fail

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

--- test/routes/projects.coffee
+++ test/routes/projects.coffee
@@ -0,0 +1,21 @@
+request = require 'request'
+async = require 'async'
+should = require 'should'
+_ = require 'underscore'
+uuid = require 'uuid'
+
+startApp = require './../start_app'
+base = require './../base'
+options = require './../options'
+
+describe 'Projects', ->
+  before (done) ->
+    startApp -> done()
+
+  it 'should get all projects', (done)->
+    request (base '/projects'), options, (e,r,b)->
+      r.statusCode.should.be.equal 200
+      b.should.have.property 'projects'
+      done()
+
+


Bongo.jraphical: code tidyup

Bongo.jraphical: code tidyup


Random thangs are now created and positioned in the thangs view

--- app/views/editor/level/thangs_tab_view.coffee
+++ app/views/editor/level/thangs_tab_view.coffee
@@ -228,6 +228,8 @@
     console.log e
     for thang in e.thangs
       console.log thang.id, thang.pos
+      @selectAddThangType thang.id
+      @addThang @addThangType, thang.pos

   # TODO: figure out a good way to have all Surface clicks and Treema clicks just proxy in one direction, so we can maintain only one way of handling selection and deletion
   onExtantThangSelected: (e) ->
@@ -280,6 +282,7 @@
     @selectAddThang {target: icons[nextSelectedIndex]}

   selectAddThangType: (type, @cloneSourceThang) ->
+    console.log type
     if _.isString type
       type = _.find @supermodel.getModels(ThangType), (m) -> m.get('name') is type
     pos = @addThangSprite?.thang.pos  # Maintain old sprite's pos if we have it
@@ -397,6 +400,7 @@
     @editThang thangID: id if id

   addThang: (thangType, pos) ->
+    console.log thangType, pos
     thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @thangsTreema.get "id=#{thangID}"
     if @cloneSourceThang
       components = _.cloneDeep @thangsTreema.get "id=#{@cloneSourceThang.id}/components"


fixed bug in google marker bis

fixed bug in google marker bis

--- vendor/assets/javascripts/gmaps4rails/google/objects/marker.coffee
+++ vendor/assets/javascripts/gmaps4rails/google/objects/marker.coffee
@@ -12,6 +12,7 @@
     clusterer_maxZoom:       5
     custom_cluster_pictures: null
     custom_infowindow_class: null
+    raw:                     {}

   constructor: (args, controller)->
     @controller = controller


Getting rid of a debug line.

Getting rid of a debug line.

--- app/models/SuperModel.coffee
+++ app/models/SuperModel.coffee
@@ -60,7 +60,6 @@
       @addCollection collection
       onCollectionSynced = (c) ->
         if collection.url is c.url
-          console.debug 'Registering collection', url, c
           @registerCollection c
         else
           console.warn 'Sync triggered for collection', c


Updates updater script

Updates updater script

error: pathspec 'coffee/tools/updater.coffee' did not match any file(s) known to git

--- coffee/tools/updater.coffee
+++ coffee/tools/updater.coffee
@@ -0,0 +1,61 @@
+#
+# NTB MongoDB updater script
+#
+# @author Hans Kristian Flaatten
+#
+
+"use strict"
+
+mongodb = require 'mongodb'
+database = require './../database'
+
+database.connect 'ntb_07', (err, db) ->
+  return console.log 'db err', err if err
+
+  console.log 'Database connection is open'
+
+  db.collection 'aktiviteter', (err, collection) ->
+    if err
+      console.log 'db connection failed'
+      console.log err
+      return db.close()
+
+    console.log "Collection is open"
+
+    update = (doc, cb) ->
+      return cb null if doc.geojson.coordinates[0] < doc.geojson.coordinates[1]
+
+      coords = doc.geojson.coordinates
+
+      lat = coords[0]
+      lng = coords[1]
+
+      coords[0] = lng
+      coords[1] = lat
+
+      if typeof coords[2] is 'undefined' or coords[2] is 0
+        coords[2] = -999
+
+      doc.geojson.coordinates = coords
+      console.log doc.geojson.coordinates
+
+      collection.save doc, (err) ->
+        cb err
+
+    collection.find {"geojson" : {$exists: true}}, (err, cursor) ->
+      if err
+        console.log 'collection.find() failed'
+        console.log err
+        return db.close()
+
+      database.each cursor, update, (err) ->
+        if err
+          console.log 'database update failed'
+          console.log err
+        else
+          console.log 'databse update success'
+
+        db.close()
+
+
+


Add the amount of messages where the error occurs to the db object

--- packages/rocketchat-importer-slack/main.coffee
+++ packages/rocketchat-importer-slack/main.coffee
@@ -67,7 +67,7 @@
 						messagesId = @collection.insert { 'import': importId, 'type': 'messages', 'name': "#{channel}/#{date}", 'messages': msgs }
 						@messages[channel][date] = @collection.findOne messagesId
 					catch error
-						RocketChat.models.Imports.update { _id: @importRecord._id }, { $set: { 'status': "entries.messages.error:#{channel}/#{date}", 'error': error, 'count.messages': messagesCount }}
+						RocketChat.models.Imports.update { _id: @importRecord._id }, { $set: { 'status': "entries.messages.error:#{channel}/#{date}", 'error': error, 'count.messages': messagesCount, 'count.dateoferror': msgs.length }}
 						return error

 			RocketChat.models.Imports.update { _id: @importRecord._id }, { $set: { 'status': 'entries', 'count.messages': messagesCount }}


fix not showing any css

fix not showing any css

--- packages/rocketchat-theme/server/server.coffee
+++ packages/rocketchat-theme/server/server.coffee
@@ -77,23 +77,25 @@

 			hash = crypto.createHash('sha1').update(data.css).digest('hex')

-			program = WebApp.clientPrograms['web.cordova']
-			themeManifestItem = _.find program.manifest, (item) -> return item.path is 'app/theme.css'
-			themeManifestItem.type = 'css'
-			themeManifestItem.where = 'client'
-			themeManifestItem.url = "/theme.css?#{hash}"
-			themeManifestItem.size = data.css.length
-			themeManifestItem.hash = hash
-			program.version = WebApp.calculateClientHashCordova()
+			if WebApp.clientPrograms['web.cordova']?
+				program = WebApp.clientPrograms['web.cordova']
+				themeManifestItem = (_.find program?.manifest, (item) -> return item.path is 'app/theme.css') or {}
+				themeManifestItem.type = 'css'
+				themeManifestItem.where = 'client'
+				themeManifestItem.url = "/theme.css?#{hash}"
+				themeManifestItem.size = data.css.length
+				themeManifestItem.hash = hash
+				program.version = WebApp.calculateClientHashCordova()

-			program = WebApp.clientPrograms['web.browser']
-			themeManifestItem = _.find program.manifest, (item) -> return item.path is 'app/theme.css'
-			themeManifestItem.type = 'css'
-			themeManifestItem.where = 'client'
-			themeManifestItem.url = "/theme.css?#{hash}"
-			themeManifestItem.size = data.css.length
-			themeManifestItem.hash = hash
-			program.version = WebApp.calculateClientHashRefreshable()
+			if WebApp.clientPrograms['web.browser']?
+				program = WebApp.clientPrograms['web.browser']
+				themeManifestItem = _.find program?.manifest, (item) -> return item.path is 'app/theme.css'
+				themeManifestItem.type = 'css'
+				themeManifestItem.where = 'client'
+				themeManifestItem.url = "/theme.css?#{hash}"
+				themeManifestItem.size = data.css.length
+				themeManifestItem.hash = hash
+				program.version = WebApp.calculateClientHashRefreshable()

 			Autoupdate.autoupdateVersion            = __meteor_runtime_config__.autoupdateVersion            = process.env.AUTOUPDATE_VERSION or WebApp.calculateClientHashNonRefreshable()
 			Autoupdate.autoupdateVersionRefreshable = __meteor_runtime_config__.autoupdateVersionRefreshable = process.env.AUTOUPDATE_VERSION or WebApp.calculateClientHashRefreshable()


Forget param in doc

Forget param in doc

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/metidia/dynoga.git/'


HistoryManager: Added tests.

HistoryManager: Added tests.

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

--- src/tests/core/test_historyManager.coffee
+++ src/tests/core/test_historyManager.coffee
@@ -0,0 +1,75 @@
+goog = goog or goog = require: ->
+goog.history or= {}
+goog.history.Html5History or= isSupported: ->
+
+goog.require 'spark.core.HistoryManager'
+
+
+describe 'spark.core.HistoryManager', ->
+
+
+  historyManager  = null
+  useHtml5History = -> goog.history.Html5History.isSupported = -> return yes
+  useGoogHistory  = -> goog.history.Html5History.isSupported = -> return no
+  getHtml5History = ->
+    useHtml5History()
+    return new spark.core.HistoryManager
+
+  getGoogHistory  = ->
+    useGoogHistory()
+    h = new spark.core.HistoryManager
+    useHtml5History()
+    return h
+
+  beforeEach ->
+    historyManager = getHtml5History()
+
+
+  it 'should extend spark.core.Object', ->
+    expect(historyManager instanceof spark.core.Object).toBeTruthy()
+
+
+  it 'should have correct history instance for hashbang or pushstate', ->
+    if goog.DEBUG
+      expect(historyManager.history instanceof goog.history.Html5History).toBeTruthy()
+
+      googHistoryManager = getGoogHistory()
+
+      expect(googHistoryManager.history instanceof goog.History).toBeTruthy()
+
+
+  it 'should change the url', ->
+    historyManager.setToken 'hello-world'
+
+    {href} = document.location
+    expect(href.indexOf('#')).toBe -1
+    expect(href.indexOf('hello-world')).toBeGreaterThan -1
+
+    historyManager.setToken '/'
+    {href} = document.location
+
+    expect(href.indexOf('hello-world')).toBe -1
+
+    if goog.DEBUG
+      hashedHistory = getGoogHistory()
+      hashedHistory.setToken 'hello-world'
+      {href} = document.location
+
+      expect(href.indexOf('#')).toBeGreaterThan -1
+      expect(href.indexOf('hello-world')).toBeGreaterThan -1
+
+
+  it 'should emit Navigated event with token as event.data', ->
+    flag = null
+
+    historyManager.on 'Navigated', (e) -> flag = e.data
+    historyManager.setToken '/hello'
+
+    expect(flag).toBe '/hello'
+
+
+  it 'should have path prefix if a pathPrefix option passed', ->
+    hm = new spark.core.HistoryManager pathPrefix: 'prefix'
+    hm.setToken '/world'
+
+    expect(document.location.href.indexOf('/prefix/world')).toBeGreaterThan -1


added commands dir & template

added commands dir & template

error: pathspec 'template/commands/command-template.coffee' did not match any file(s) known to git

--- template/commands/command-template.coffee
+++ template/commands/command-template.coffee
@@ -0,0 +1,4 @@
+log = require 'node-log'
+
+exports.exe = (cmd, args) ->
+  ## your command code


add this

add this

error: pathspec 'src/openpgp/packet/all.iced' did not match any file(s) known to git

--- src/openpgp/packet/all.iced
+++ src/openpgp/packet/all.iced
@@ -0,0 +1,4 @@
+
+exports.KeyMaterial = require('./keymaterial').KeyMaterial
+exports.Signature = require('./signature').Signature
+exports.UserID  = require('./userid').UserID