fixed scoring module to work with both CouchDB and JS

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


More closely match Apple mail shortcuts

More closely match Apple mail shortcuts

error: pathspec 'keymaps/templates/Apple' did not match any file(s) known to git
error: pathspec 'Mail.cson' did not match any file(s) known to git


initial implementations of BC_COMPARE_LT, BC_COMPARE_GT, BC_COMPARE_LTEQ, BC_COMPARE_GTEQ

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


nouvelles questions

nouvelles questions

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/LucasAdam/hubot-trivia-game-french.git/'


TODO already done

TODO already done

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


removed old feature comment editing code

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


Fix getting a document by slug or id and projecting it without its permissions

--- server/commons/Handler.coffee
+++ server/commons/Handler.coffee
@@ -214,6 +214,7 @@
     if req.query.project
       projection = {}
       projection[field] = 1 for field in req.query.project.split(',')
+      projection.permissions = 1 # TODO: A better solution for always including properties the server needs
     @getDocumentForIdOrSlug id, projection, (err, document) =>
       return @sendDatabaseError(res, err) if err
       return @sendNotFoundError(res) unless document?


re-add CM react

re-add CM react

error: pathspec 'urb/zod/base/pub/tree/src/js/components/CodeMirror.coffee' did not match any file(s) known to git

--- urb/zod/base/pub/tree/src/js/components/CodeMirror.coffee
+++ urb/zod/base/pub/tree/src/js/components/CodeMirror.coffee
@@ -0,0 +1,8 @@
+recl = React.createClass
+[div,textarea] = [React.DOM.div,React.DOM.textarea]
+
+module.exports = recl
+  render: -> div {}, textarea ref:'ed', value:@props.value
+  componentDidMount: ->
+    CodeMirror.fromTextArea @refs.ed.getDOMNode(),
+      readOnly:true


Component that performs no operations

Component that performs no operations

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

--- src/components/Drop.coffee
+++ src/components/Drop.coffee
@@ -0,0 +1,12 @@
+noflo = require "noflo"
+
+class Drop extends noflo.Component
+    description: "This component drops every packet it receives with no action"
+
+    constructor: ->
+        @inPorts =
+            in: new noflo.Port()
+
+        @outPorts = {}
+
+exports.getComponent = -> new Drop


I forgot

I forgot

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/0xenvision/negotiator-inator.git/'


<view> DriverProfile - Created

<view> DriverProfile - Created

error: pathspec 'client/app/views/driverProfile.coffee' did not match any file(s) known to git

--- client/app/views/driverProfile.coffee
+++ client/app/views/driverProfile.coffee
@@ -0,0 +1,14 @@
+BaseView = require '../lib/base_view'
+
+module.exports = class DriverProfile extends BaseView
+    className: 'device-profile'
+    template: require 'templates/driverProfile'
+
+    initialize: ->
+        @listenTo @model, 'change', => @render()
+
+    getRenderData: ->
+        out =
+            name: @model.name
+            directory: @model.getDirectory()
+        return out


Forgot this

Forgot this

error: pathspec 'lib/psd/layer_info/fill_opacity.coffee' did not match any file(s) known to git

--- lib/psd/layer_info/fill_opacity.coffee
+++ lib/psd/layer_info/fill_opacity.coffee
@@ -0,0 +1,7 @@
+LayerInfo = require '../layer_info.coffee'
+
+module.exports = class FillOpacity extends LayerInfo
+  @shouldParse: (key) -> key is 'iOpa'
+
+  parse: ->
+    @value = @file.readByte()


Created test for open.

Created test for open.

error: pathspec 't/strata/open.t.coffee' did not match any file(s) known to git

--- t/strata/open.t.coffee
+++ t/strata/open.t.coffee
@@ -0,0 +1,10 @@
+#!/usr/bin/env coffee-streamline
+return if not require("streamline/module")(module)
+fs = require "fs"
+require("./harness") 1, ({ Strata, directory }, _) ->
+  strata = new Strata directory: directory, leafSize: 3, branchSize: 3
+  strata.create(_)
+  strata.close(_)
+  strata = new Strata directory: directory, leafSize: 3, branchSize: 3
+  strata.open(_)
+  @equal strata._io.nextAddress, 2, "next address"


check in the application component abstraction

error: pathspec 'library/gearbox/application.coffee' did not match any file(s) known to git

--- library/gearbox/application.coffee
+++ library/gearbox/application.coffee
@@ -0,0 +1,93 @@
+###
+Copyright (c) 2013, Alexander Cherniuk <ts33kr@gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+###
+
+_ = require "lodash"
+assert = require "assert"
+
+{Pinpoint} = require "../gearbox/pinpoint"
+{Exchange} = require "../gearbox/exchange"
+{Policies} = require "../gearbox/policies"
+{GrandCentral} = require "../gearbox/central"
+{Localized} = require "../fringes/localized"
+{Bilateral} = require "../membrane/bilateral"
+{Auxiliaries} = require "../membrane/auxes"
+{Preflight} = require "../membrane/preflight"
+
+# This abstract compound is designed to be the starting point in a
+# clearly disambigued tree of inheritance for the application and
+# the framework services. This particular abstraction is marking
+# an application, which is one of entrypoints within the concept
+# of `Single Page Applications`. This component encompases all
+# of the functionality need for providing a good `root` service.
+module.exports.Application = class Application extends Preflight
+
+    # This is a marker that indicates to some internal subsystems
+    # that this class has to be considered abstract and therefore
+    # can not be treated as a complete class implementation. This
+    # mainly is used to exclude or account for abstract classes.
+    # Once inherited from, the inheritee is not abstract anymore.
+    @abstract yes
+
+    # These declarations below are implantations of the abstracted
+    # components by the means of the dynamic recomposition system.
+    # Please take a look at the `Composition` class implementation
+    # for all sorts of information on the composition system itself.
+    # Each of these will be dynamicall integrated in class hierarchy.
+    # P.S. These are the core definitions for every active component.
+    @implanting Auxiliaries, Bilateral, Policies
+
+    # These declarations below are implantations of the abstracted
+    # components by the means of the dynamic recomposition system.
+    # Please take a look at the `Composition` class implementation
+    # for all sorts of information on the composition system itself.
+    # Each of these will be dynamicall integrated in class hierarchy.
+    # P.S. These are the secondary essentials for every active comp.
+    @implanting Localized, Pinpoint, Exchange, GrandCentral
+
+    # This method is synchronized over the `attached` event of the
+    # kernel that gets fired once some component has been booted.
+    # Method monitors all the attachment events, and every time it
+    # checks if all the components has been booted. Once it so, it
+    # broadcasts `completed` event to the kernel. The event will be
+    # repeated after connection restoring, however a special event
+    # `completed-once` is guaranteed to be fired one time only.
+    waitCompletion: @synchronize "attached", (service) ->
+        broken = "could not find essential functions"
+        signature = "got an incorrect event signature"
+        ecosystem = "can not detect current ecosystem"
+        m = "Booting sequence has been completed at %s"
+        assert _.isObject(service or null), signature
+        assert _.isArray(@ecosystem or no), ecosystem
+        assert _.isFunction(@broadcast or no), broken
+        isDup = (service) -> _.isString service.duplex
+        isCom = (service) -> try service.setInOrder?()
+        duplexed = _.filter @ecosystem or [], isDup
+        completed = _.every @ecosystem or [], isCom
+        return unless completed # boot not finished
+        @broadcast "completed" # notify of completed
+        @broadcast "completed-once" unless @$complete
+        assert identify = this.constructor.identify()
+        logger.debug m.green, identify.green.bold
+        this.$complete = yes # was completed once


catchall that uses wolfram alpha.  based on wolfram code in hubot-scripts

error: pathspec 'hubot-scripts/wolfram-alpha-catchall.coffee' did not match any file(s) known to git

--- hubot-scripts/wolfram-alpha-catchall.coffee
+++ hubot-scripts/wolfram-alpha-catchall.coffee
@@ -0,0 +1,60 @@
+# Description:
+#   send catchall responses to wolfram alpha
+#   based on code found in the old hubot-script repo
+#
+# Dependencies:
+#   "wolfram": "0.2.2"
+#
+# Configuration:
+#   HUBOT_WOLFRAM_APPID - your AppID
+#
+# Commands:
+#   hubot [question] - search Wolfram Alpha for the answer to the question
+#
+# Notes:
+#   This may not work with node 0.6.x
+#
+# Author:
+#   dhorrigan, rexroof
+
+Util = require('util')
+Wolfram = require('wolfram').createClient(process.env.HUBOT_WOLFRAM_APPID)
+
+not_found = (msg) ->
+  msg.reply msg.random [
+    'hmm.  not sure.',
+    'no search results found',
+    "can't figure that one out",
+    'you should google that one',
+    'I am coming up short',
+    'beats me',
+    'that is outside of my parameters',
+    'no idea',
+    'wish I knew!',
+    'not a clue'
+  ]
+
+# process wolfram request
+wolfram_me = (input_query, msg) ->
+  console.log "got query: #{input_query}"
+  Wolfram.query input_query, (e, result) ->
+    if result and result.length > 0
+      first_result = result[1]['subpods'][0]
+      if first_result['value']
+        msg.reply first_result['value']
+      else if first_result['image']
+        msg.reply first_result['image']
+      else
+        not_found(msg)
+    else
+      not_found(msg)
+
+module.exports = (robot) ->
+  # catchall to send everything not caught to wolfram
+  robot.catchAll (msg) ->
+    # pattern to strip robot's name from query
+    r = new RegExp "^(?:#{robot.alias}|#{robot.name}):? ?(.*)", "i"
+    matches = msg.message.text.match(r)
+    if matches != null && matches.length > 1
+      wolfram_me(matches[1], msg)
+    msg.finish()


Modelo de curso

Modelo de curso

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/rodrigoeg/front-end.git/'


Added simple module test for object factory

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

--- test/all/module.coffee
+++ test/all/module.coffee
@@ -0,0 +1,28 @@
+hasModule = module? and module.exports?
+
+if hasModule
+  udefine = require '../../dist/udefine'
+  chai = require 'chai'
+else
+  {udefine, chai} = window
+
+{expect} = chai
+
+describe 'udefine module definition', ->
+
+  it 'udefine without dependencies (object factory)', ->
+    udefine 'abc',
+      a: 5
+      b: 4
+      c: 3
+
+    resProp = do ->
+      if hasModule
+        udefine.commonjs.abc
+      else
+        udefine.globals.abc
+
+    expect(resProp).to.be.a('object')
+    expect(resProp).to.have.property('a')
+    expect(resProp).to.have.property('b')
+    expect(resProp).to.have.property('c')


Fix bug preventing "null" default values.

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/JoshuaToenyes/stout-core.git/'


Fixes spacing on show orgs command

Fixes spacing on show orgs command

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


Use 4 char long for PINs

Use 4 char long for PINs

--- server/app/bongo/models/verify.coffee
+++ server/app/bongo/models/verify.coffee
@@ -48,8 +48,8 @@
             if count > 0 then console.log "#{count} expired PIN removed."
             else console.log "No such waiting PIN found."

-            # Create a random pin 7 char length
-            plainPin = Math.floor Math.random()*10000001
+            # Create a random pin 4 char length
+            plainPin = Math.floor Math.random()*10001
             pin      = crypto.createHash('sha1').update(plainPin+'').digest('hex')

             # Create and send new pin


Prevent http.get error when requested url has port specified.

--- lib/middleware/proxy_to_gravity.coffee
+++ lib/middleware/proxy_to_gravity.coffee
@@ -13,8 +13,9 @@
 module.exports = exports = (req, res, next) ->
   urlObj = url.parse(ARTSY_URL + req.url)
   options =
-    host: urlObj.host
+    host: urlObj.hostname
     path: urlObj.path
+    port: urlObj.port or 80

   # Ping Gravity first, if the url is supported,
   # proxy the req to it. Otherwise, pass it.


Added comments to crawler profile page

Added comments to crawler profile page

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


Reply to user with eight-ball answers

Reply to user with eight-ball answers

Helps avoid confusion with lots of eight-ball questions happening at
once in a room.

--- src/scripts/eight-ball.coffee
+++ src/scripts/eight-ball.coffee
@@ -28,6 +28,6 @@

 module.exports = (robot) ->
   robot.respond /(eightball|8ball)(.*)/i, (msg) ->
-    msg.send msg.random ball
+    msg.reply msg.random ball


Usage Monitoring

Usage Monitoring

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


Add method to fire events globaly

Add method to fire events globaly

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

--- client/lib/fireEvent.coffee
+++ client/lib/fireEvent.coffee
@@ -0,0 +1,2 @@
+window.fireGlobalEvent = (eventName, params) ->
+	window.dispatchEvent new CustomEvent(eventName, {detail: params})


Primitive specs

Primitive specs

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

--- spec/primitives-spec.coffee
+++ spec/primitives-spec.coffee
@@ -0,0 +1,23 @@
+jsf = require('../lib')
+
+describe 'JSON-Schema primitives', ->
+  it 'should generate array-values', ->
+    expect(jsf(type: 'array', items: {})).toHaveType 'array'
+
+  it 'should generate boolean-values', ->
+    expect(jsf(type: 'boolean')).toHaveType 'boolean'
+
+  it 'should generate integer-values', ->
+    expect(jsf(type: 'integer')).toHaveType 'number'
+
+  it 'should generate number-values', ->
+    expect(jsf(type: 'number')).toHaveType 'number'
+
+  it 'should generate null-values', ->
+    expect(jsf(type: 'null')).toHaveType 'null'
+
+  it 'should generate object-values', ->
+    expect(jsf(type: 'object', properties: {})).toHaveType 'object'
+
+  it 'should generate string-values', ->
+    expect(jsf(type: 'string')).toHaveType 'string'


i want to sleep

i want to sleep

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


hubot tell-now will send the IM right away with gtalk yay!

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

--- src/scripts/tell-now.coffee
+++ src/scripts/tell-now.coffee
@@ -0,0 +1,27 @@
+# Description:
+#   Tell Hubot to send a user a message right now !
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot tellnow <username> <some message> - tell <username> <some message> right now !
+#
+# Author:
+#   earlonrails & ggongaware
+#
+# Additional Requirements
+#   Only works on gtalk
+
+module.exports = (robot) ->
+  robot.respond /tell ([\w.-@]*) (.*)/i, (msg) ->
+   new_user =
+    id: msg.match[1] + "@" + msg.message.user.domain
+    name: msg.match[1]
+    user: msg.match[1]
+    type: "chat"
+
+   robot.send new_user, msg.match[2]


Global marks; only handle messages in main frame.

On sites with several frames (e.g. Facebook), if we allow all of the
frames to handle the setScrollPosition and showHudForDuration messages,
then the focus ends up in an arbitrary frame.  And, on Facebook, say,
Vimium ends up broken until the focus is returned to the main frame.
So, we only handle these messages in the main frame.

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -142,7 +142,7 @@
     window.removeEventListener "focus", onFocus

   requestHandlers =
-    showHUDforDuration: (request) -> HUD.showForDuration request.text, request.duration
+    showHUDforDuration: handleShowHUDforDuration
     toggleHelpDialog: (request) -> toggleHelpDialog(request.dialogHtml, request.frameId)
     focusFrame: (request) -> if (frameId == request.frameId) then focusThisFrame request
     refreshCompletionKeys: refreshCompletionKeys
@@ -264,13 +264,16 @@

   refreshCompletionKeys(request)

-# Set the scroll position (but only in the main frame).  Some pages (like Facebook) get confused if you set
-# the scroll position in all frames.
+handleShowHUDforDuration = ({ text, duration }) ->
+  if DomUtils.isTopFrame()
+    DomUtils.documentReady -> HUD.showForDuration text, duration
+
 setScrollPosition = ({ scrollX, scrollY }) ->
   if DomUtils.isTopFrame()
-    if scrollX > 0 or scrollY > 0
-      DomUtils.documentReady ->
-        window.focus()
+    DomUtils.documentReady ->
+      window.focus()
+      document.body.focus()
+      if 0 < scrollX or 0 < scrollY
         Marks.setPreviousPosition()
         window.scrollTo scrollX, scrollY


Add env and it's related test.

Add env and it's related test.

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

--- test/coffiew/config.coffee
+++ test/coffiew/config.coffee
@@ -0,0 +1,12 @@
+# Tests configuration.
+#
+# Author: Andy Zhao(andy@nodeswork.com)
+
+config = require 'coffiew/config'
+
+describe 'Config', ->
+
+  describe 'env', ->
+
+    it 'should run in nodes', ->
+      config.env.isNode.should.be.true


Added tests for brainpool keys

Added tests for brainpool keys

error: pathspec 'test/files/brainpool1.iced' did not match any file(s) known to git


config: remove /WFGH from behind auth

config: remove /WFGH from behind auth

--- deployment/nginx.coffee
+++ deployment/nginx.coffee
@@ -234,11 +234,6 @@
         proxy_connect_timeout 1;
       }

-      location = /WFGH {
-        proxy_pass http://webserver;
-        #{if environment isnt "dev" then basicAuth else ""}
-      }
-
       # no need to send static file serving requests to webserver
       # serve static content from nginx
       location /a/ {


just for you

just for you

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


opt: benchmark

opt: benchmark

--- benchmark/template.coffee
+++ benchmark/template.coffee
@@ -31,10 +31,13 @@
 		      memory: #{memFormat.join(' | ')}
 		"""

+
 	resolver = (resolve) ->
 		setTimeout ->
 			resolve()
 		, 1
+
+	resolver = (resolve) -> resolve()

 	asyncTask = ->
 		new Promise(resolver).then checkEnd


Add ContentEditableView

Add ContentEditableView

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

--- app/assets/javascripts/views/content_editable_view.js.coffee
+++ app/assets/javascripts/views/content_editable_view.js.coffee
@@ -0,0 +1,38 @@
+Ember.ContentEditableView = Em.View.extend
+  tagName: 'div'
+  attributeBindings: ['contenteditable', 'placeholder']
+
+  # Variables:
+  editable: false
+  isUserTyping: false
+  plaintext: false
+
+  # Properties:
+  contenteditable: (->
+    editable = @get('editable')
+    (if editable then 'true' else `undefined`)
+  ).property('editable')
+
+  # Observers:
+  valueObserver: (->
+    @setContent()  if not @get('isUserTyping') and @get('value')
+  ).observes('value')
+
+  # Events:
+  didInsertElement: ->
+    @setContent()
+
+  focusOut: ->
+    @set 'isUserTyping', false
+
+  keyDown: (event) ->
+    @set 'isUserTyping', true  unless event.metaKey
+
+  keyUp: (event) ->
+    if @get('plaintext')
+      @set 'value', @$().text()
+    else
+      @set 'value', @$().html()
+
+  setContent: ->
+    @$().html @get('value')


Fix gulpfile and add two themes

Fix gulpfile and add two themes

--- gulpfile.coffee
+++ gulpfile.coffee
@@ -34,11 +34,13 @@
     slate: 'https://bootswatch.com/slate/bootstrap.css'
     superhero: 'https://bootswatch.com/superhero/bootstrap.css'
     united: 'https://bootswatch.com/united/bootstrap.css'
+    lumendark: 'https://raw.githubusercontent.com/PHELiOX/poi-theme-lumendark/master/lumendark.css'
+    paperdark: 'https://raw.githubusercontent.com/ruiii/poi_theme_paper_dark/master/paper_dark.css'
   for theme, url of themes
     dir = path.join(__dirname, 'assets', 'themes', theme, 'css')
     fs.ensureDirSync dir
     log "Downloding #{theme} theme."
-    data = yield request.getAsync url,
+    [res, data] = yield request.getAsync url,
       encoding: null
     yield fs.writeFileAsync path.join(dir, "#{theme}.css"), data


Gulpfile

Gulpfile

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

--- gulpfile.coffee
+++ gulpfile.coffee
@@ -0,0 +1,20 @@
+'use strict'
+
+
+taskMasterOptions =
+  dirname: 'src/gulp'
+  pattern: '*.coffee'
+  cwd: process.cwd()
+  watchExt: '.watch'
+
+gulp = require('gulp-task-master')(taskMasterOptions)
+
+
+gulp.task "watch",  ['compile-lib.watch','compile-bin.watch']
+gulp.task "bot", ['compile-lib.watch','compile-bin.watch']
+
+
+
+gulp.task "default", ['compile-lib','compile-bin']
+
+


Implemented issue #1689 - Enable state "merged" for admin overviews, triggers and jobs.

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

--- app/assets/javascripts/app/controllers/_ui_element/select_search.coffee
+++ app/assets/javascripts/app/controllers/_ui_element/select_search.coffee
@@ -0,0 +1,35 @@
+# coffeelint: disable=camel_case_classes
+class App.UiElement.select_search extends App.UiElement.ApplicationUiElement
+  @render: (attribute, params) ->
+
+    # set multiple option
+    if attribute.multiple
+      attribute.multiple = 'multiple'
+    else
+      attribute.multiple = ''
+
+    delete attribute.filter
+
+    # build options list based on config
+    @getConfigOptionList(attribute, params)
+
+    # build options list based on relation
+    @getRelationOptionList(attribute, params)
+
+    # add null selection if needed
+    @addNullOption(attribute, params)
+
+    # sort attribute.options
+    @sortOptions(attribute, params)
+
+    # finde selected/checked item of list
+    @selectedOptions(attribute, params)
+
+    # disable item of list
+    @disabledOptions(attribute, params)
+
+    # filter attributes
+    @filterOption(attribute, params)
+
+    # return item
+    $( App.view('generic/select')(attribute: attribute) )


formating docs

formating docs

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


Committing test-more-js

Committing test-more-js

error: pathspec 'ext/test-more-js/lib/test/more.coffee' did not match any file(s) known to git

--- ext/test-more-js/lib/test/more.coffee
+++ ext/test-more-js/lib/test/more.coffee
@@ -0,0 +1,95 @@
+_ = require 'lodash'
+
+class global.TestMore
+  constructor: ->
+    @plan = 0
+    @run = 0
+    @bail = false
+
+  next: ->
+    ++@run
+
+  pass: (label='')->
+    label = " - #{label}" if label
+    @say "ok #{@next()}#{label}"
+  fail: (label='')->
+    label = " - #{label}" if label
+    @say "not ok #{@next()}#{label}"
+    if @bail
+      @say "Bail out!"
+      process.exit 255
+
+  say: (msg)->
+    process.stdout.write "#{msg}\n"
+  nay: (msg)->
+    process.stderr.write "#{msg}\n"
+
+_.extend global,
+  plan: ({tests, skip_all})->
+    if skip_all
+      TestMore.say "1..0 # SKIP #{skip_all}"
+      process.exit 0
+    tests or throw "Usage: plan tests: <number>"
+    TestMore.plan = tests
+    TestMore.say "1..#{tests}"
+  done_testing: (plan)->
+    plan ||= TestMore.run
+    TestMore.say "1..#{plan}"
+
+  pass: (label='')->
+    TestMore.pass label
+  fail: (label='')->
+    TestMore.fail label
+
+  ok: (test, label='')->
+    if test
+      pass label
+    else
+      fail label
+      diag "  Failed test '#{label}"
+
+  Is: (got, want, label='')->
+    if got == want
+      pass label
+    else
+      fail label
+      diag """
+        Failed test '#{label}'
+               got: '#{got}'
+          expected: '#{want}'
+      """
+  isnt: (got, want, label='')->
+    if got != want
+      pass label
+    else
+      fail label
+  like: (got, want, label='')->
+    if got.match want
+      pass label
+    else
+      fail label
+      diag """
+                        '#{got}'
+          doesn't match '#{want}'
+      """
+  unlike: (got, want, label='')->
+    if not got.match want
+      pass label
+    else
+      fail label
+
+  diag: (msg)->
+    msg = '# ' + msg.replace /\n/g, "\n# "
+    TestMore.nay msg
+  note: (msg)->
+    msg = '# ' + msg.replace /\n/g, "\n# "
+    TestMore.say msg
+
+  BAIL_OUT: (msg='No reason given.')->
+    TestMore.say "Bail out!  #{msg}"
+    process.exit 255
+  BAIL_ON_FAIL: ()->
+    TestMore.bail = true
+
+  # Replace global class with global singleton:
+  TestMore: new TestMore


Use 3 crs as speakers description lang separation

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


:lipstick:

:lipstick:

--- spec/app/pane-spec.coffee
+++ spec/app/pane-spec.coffee
@@ -273,7 +273,6 @@
   describe "pane:close", ->
     it "destroys all items and removes the pane", ->
       pane.showItem(editSession1)
-      initialItemCount = pane.getItems().length
       pane.trigger 'pane:close'
       expect(pane.hasParent()).toBeFalsy()
       expect(editSession2.destroyed).toBeTruthy()


emit a levelup event

emit a levelup event


add clients information

add clients information

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

--- src/coffee/clients.coffee
+++ src/coffee/clients.coffee
@@ -0,0 +1,130 @@
+class Clients
+  android: [
+    {
+      title: 'AntennaPod'
+      scheme: 'pcast://'
+      platform: ['android']
+      icon: 'android/antennapod@2x.png'
+      install: 'https://play.google.com/store/apps/details?id=de.danoeh.antennapod'
+    },
+    {
+      title: 'BeyondPod'
+      scheme: 'pcast://'
+      platform: ['android']
+      icon: 'android/beyondpod@2x.png'
+      install: 'https://play.google.com/store/apps/details?id=mobi.beyondpod'
+    },
+    {
+      title: 'PocketCasts'
+      scheme: 'pcast://'
+      platform: ['android']
+      icon: 'android/pocketcasts@2x.png'
+      install: 'https://play.google.com/store/apps/details?id=au.com.shiftyjelly.pocketcasts'
+    },
+    {
+      title: 'Podkicker'
+      scheme: 'pcast://'
+      platform: ['android']
+      icon: 'android/podkicker@2x.png'
+      install: 'https://play.google.com/store/apps/details?id=ait.podka'
+    },
+    {
+      title: 'uPod'
+      scheme: 'pcast://'
+      platform: ['android']
+      icon: 'android/upod@2x.png'
+      install: 'https://play.google.com/store/apps/details?id=mobi.upod.app'
+    }
+  ]
+
+  ios: [
+    {
+      title: 'Apple Podcasts'
+      scheme: 'pcast://'
+      platform: ['ios']
+      icon: 'ios/podcasts@2x.png'
+      install: 'https://itunes.apple.com/de/app/podcasts/id525463029'
+    },
+    {
+      title: 'Castro'
+      scheme: 'castro://subscribe/'
+      platform: ['ios']
+      icon: 'ios/castro@2x.png'
+      install: 'https://itunes.apple.com/de/app/castro-high-fidelity-podcasts/id723142770'
+    },
+    {
+      title: 'Downcast'
+      scheme: 'downcast://'
+      platform: ['ios']
+      icon: 'ios/downcast@2x.png'
+      install: 'https://itunes.apple.com/de/app/downcast/id393858566'
+    },
+    #{
+      #title: 'iCatcher'
+      #scheme: 'icatcher://'
+      #platform: ['ios']
+      #icon: 'ios/icatcher@2x.png'
+      #install: 'https://itunes.apple.com/de/app/icatcher!-podcast-app/id414419105'
+    #},
+    {
+      title: 'Instacast'
+      scheme: 'instacast://'
+      platform: ['ios']
+      icon: 'ios/instacast@2x.png'
+      install: 'https://itunes.apple.com/de/app/instacast-4-podcast-client/id577056377'
+    },
+    {
+      title: 'Overcast'
+      scheme: 'overcast://x-callback-url/add?url='
+      platform: ['ios']
+      icon: 'ios/overcast@2x.png'
+      install: 'https://itunes.apple.com/de/app/overcast-podcast-player/id888422857'
+    },
+    #{
+      #title: 'PocketCasts'
+      #scheme: 'pktc://'
+      #platform: ['ios']
+      #icon: 'ios/pocketcasts@2x.png'
+      #install: 'https://itunes.apple.com/de/app/pocket-casts/id414834813'
+    #},
+    #{
+      #title: 'Podcat'
+      #scheme: 'podcat://'
+      #platform: ['ios']
+      #icon: 'ios/podcat@2x.png'
+    #},
+  ]
+
+  osx: [
+    {
+      title: 'Downcast'
+      scheme: 'downcast://'
+      platform: ['osx']
+      icon: 'osx/downcast@2x.png'
+      install: 'https://itunes.apple.com/de/app/downcast/id668429425?mt=12&uo=4'
+    },
+    {
+      title: 'Instacast'
+      scheme: 'instacast://'
+      platform: ['osx']
+      icon: 'osx/instacast@2x.png'
+      install: 'https://itunes.apple.com/de/app/instacast/id733258666?mt=12&uo=4'
+    },
+    {
+      title: 'iTunes'
+      scheme: 'itpc://'
+      platform: ['osx']
+      icon: 'osx/itunes@2x.png'
+      install: 'http://www.apple.com/itunes/'
+    }
+  ]
+
+  windowsPhone: [
+    {
+      title: 'Podcasts'
+      scheme: 'wp-podcast://'
+      platform: 'windowsPhone'
+    }
+  ]
+
+module.exports = Clients


Truck asset path correction on index.html

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


Drone hover example

Drone hover example

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

--- examples/drone.coffee
+++ examples/drone.coffee
@@ -0,0 +1,12 @@
+Cylon = require 'cylon'
+
+Cylon.robot
+  connection: { name: 'ardrone', adaptor: 'ardrone', port: '192.168.1.1' }
+  device: { name: 'drone', driver: 'ardrone' }
+
+  work: (my) ->
+    my.drone.takeoff()
+    after 10.seconds(), -> my.drone.land()
+    after 15.seconds(), -> my.drone.stop()
+
+.start()


Added save on run feature

Added save on run feature

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/davidpaulrosser/atom-maya.git/'


Trim trailing whitespace

Trim trailing whitespace

--- plugins/github-issues/index.coffee
+++ plugins/github-issues/index.coffee
@@ -10,7 +10,7 @@
       body: @markdownBody(event)
       # Regex removes surrounding whitespace around commas while retaining inner whitespace
       # and then creates an array of the strings
-      labels: (config?.labels || "bugsnag").split(/\s*,\s*/).compact(true)
+      labels: (config?.labels || "bugsnag").trim().split(/\s*,\s*/).compact(true)

     # Start building the request
     req = @request


Fix logic for liquid planner

Fix logic for liquid planner

--- plugins/liquidplanner/index.coffee
+++ plugins/liquidplanner/index.coffee
@@ -27,7 +27,7 @@
           title: "Bugsnag entry"
           url: "#{event.error.url}"

-    config.host = BASE_URL if config.host
+    config.host = BASE_URL unless config.host

     # Send the request
     @request


Add grunt task to import tags from the old site

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

--- grunt/importer.coffee
+++ grunt/importer.coffee
@@ -0,0 +1,122 @@
+fs = require 'fs'
+async = require 'async'
+sqlite = require 'sqlite3'
+_ = require 'lodash'
+
+settings = require('../settings').get()
+
+normalizeTagName = (name, fullPath) ->
+    name = name.replace(/_/g, ' ')
+               .replace(/([^a-z'\-\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]|^)([a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF])/g,
+                    (match, p1, p2) ->
+                        p1 + String.fromCharCode p2.charCodeAt(0) - 0x20
+               )
+
+    if 'player' not in fullPath.split '/'
+        _.each ['A', 'An', 'The', 'As', 'Of', 'In', 'On', 'For', 'By', 'And', 'But', 'At', 'To', 'Up', 'Or', 'Nor', 'With'], (word) ->
+            re = new RegExp "(?!^)\\b#{word}\\b", 'g'
+            name = name.replace re, word.toLowerCase()
+
+    name
+
+module.exports = (grunt) ->
+    grunt.registerTask 'importTags', 'Load an old format tag file and import both tags and tag relations from it', (filename) ->
+        success = @async()
+
+        if !filename?
+            return grunt.fail.fatal 'No filename was provided!'
+
+        fs.readFile filename, {
+            encoding: 'utf-8'
+        },  (err, data) ->
+            if err?
+                return grunt.fail.fatal 'Reading the file failed!'
+
+            tagList = {}
+            relList = {}
+            index = 0
+
+            # Store the tags in addition order to enforce that parents are always added before children
+            orderedTagArray = []
+
+            checkTagTreeBranch = (file, tag) ->
+                tagHierarchy = tag.split '/'
+                tagFragment = ''
+                while tagHierarchy.length > 0
+                    oldFragment = tagFragment
+                    section = tagHierarchy.shift()
+                    if oldFragment == ''
+                        tagFragment = section
+                    else
+                        tagFragment += '/' + section
+
+                    if !tagList[tagFragment]?
+                        newIndex = index++
+                        tagList[tagFragment] =
+                            index: newIndex
+                            name: normalizeTagName section, tagFragment
+                            parent: if oldFragment == '' then null else tagList[oldFragment].index
+                            parentFragment: oldFragment
+                        relList[tagFragment] = []
+                        orderedTagArray.push tagFragment
+
+                relList[tag].push file
+
+            data = data.replace(/\r\n/g, '\n').split '\n'
+            _.each data, (line) ->
+                if line.length > 0 && line[0] != '#' && line.indexOf ':' != -1
+                    line = line.split ':', 2
+
+                    filename = line[0]
+                    tags = line[1].split ' '
+
+                    _.each tags, (tag) ->
+                        checkTagTreeBranch filename, tag
+
+            rels = _.reduce relList, (total, tag) ->
+                total += tag.length
+            , 0
+
+            console.log "Tag file parsed. Found #{Object.keys(tagList).length} tags and #{rels} relations."
+
+            console.log _.pluck tagList, 'name'
+            return
+
+            db = new sqlite.Database settings.database
+
+            async.eachSeries orderedTagArray, (tagName, cb) ->
+                # First, add tags. These need to go in series to ensure the parent tag has always been added by the
+                # point its childrens are being added respectively.
+                tag = tagList[tagName]
+                realParentID = if tag.parentFragment == '' then null else tagList[tag.parentFragment].realID
+                db.run 'INSERT INTO tTag (name, parent, icon, priority) VALUES (?, ?, ?, ?)',
+                    tag.name, realParentID, null, null, (err) ->
+                        if err?
+                            success false
+                            throw err
+                        else
+                            tagList[tagName].realID = @lastID
+                            console.log "ID for #{tagName} is #{@lastID}"
+                            cb()
+            , (err) ->
+                console.log 'Adding relations for the recently added tags.'
+                db.all 'SELECT id, locator FROM tFile', (err, files) ->
+                    fileIDs = _.transform files, (result, file) ->
+                        result[file.locator] = file.id
+                    , {}
+
+                    if err?
+                        success false
+                        throw err
+                    else
+                        # Then, add tag relations. These can go to the database in any order.
+                        async.forEachOf relList, (filenames, tagName, cb) ->
+                            async.each filenames, (file, cb2) ->
+                                if fileIDs[file]?
+                                    db.run 'INSERT INTO tFileTagRel (file, tag) VALUES (?, ?)',
+                                        fileIDs[file], tagList[tagName].realID, (err) ->
+                                            console.log "Added a relation between #{file} and #{tagName}."
+                                            cb2()
+                            , cb
+                        , (err) ->
+                            success err


Use -interaction=nonstopmode rather than -b

Should fix #113

--- lib/builder.coffee
+++ lib/builder.coffee
@@ -41,7 +41,7 @@
   texify: (dir, texfile, texfilename, user_options, user_program) ->
     @ltConsole.addContent("texify builder")

-    options = ["-b", "-p"]
+    options = ["-p", "--tex-option=\"-interaction=nonstopmode\""]

     user_program = switch user_program
       when 'pdflatex' then 'pdftex'


Fixed: ship pane stuck under certain situation

--- views/components/main/parts/miniship-parts/minipanebody.cjsx
+++ views/components/main/parts/miniship-parts/minipanebody.cjsx
@@ -153,6 +153,7 @@
   shouldComponentUpdate: (nextProps, nextState) ->
     nextProps.activeDeck is @props.deckIndex and nextProps.show
   componentWillReceiveProps: (nextProps) ->
+    {_ships} = window
     if @condDynamicUpdateFlag
       @condDynamicUpdateFlag = not @condDynamicUpdateFlag
     else


Client: Activity: Created ConsequentMessageItem

error: pathspec 'client/activity/lib/components/chatlistitem/consequentmessageitem.coffee' did not match any file(s) known to git

--- client/activity/lib/components/chatlistitem/consequentmessageitem.coffee
+++ client/activity/lib/components/chatlistitem/consequentmessageitem.coffee
@@ -0,0 +1,34 @@
+kd                   = require 'kd'
+React                = require 'kd-react'
+TimeAgo              = require 'app/components/common/timeago'
+MessageBody          = require 'activity/components/common/messagebody'
+ButtonWithMenu       = require 'app/components/buttonwithmenu'
+ChatListItem         = require 'activity/components/chatlistitem'
+MessageTime          = require 'activity/components/chatlistitem/messagetime'
+ActivityLikeLink     = require 'activity/components/chatlistitem/activitylikelink'
+
+module.exports = class ConsequentMessageItem extends ChatListItem
+
+  render: ->
+
+    { message } = @props
+    editFormClass       = if @state.editMode then 'ChatItem-updateMessageForm' else 'ChatItem-updateMessageForm hidden'
+    mediaContentClass   = if @state.editMode then 'MediaObject-content hidden' else 'MediaObject-content'
+    contentWrapperClass = if @state.editMode then 'ChatItem-contentWrapper MediaObject ConsequentMessageItem editing' else 'ChatItem-contentWrapper MediaObject ConsequentMessageItem'
+

+

+

+          <MessageTime date={message.get 'createdAt'}/>
+          <ActivityLikeLink />
+

+            <MessageBody source={message.get 'body'} />
+

+

+

+          <textarea onKeyDown = { @bound 'handleEditMessageKeyDown' } defaultValue={ message.get 'body' } ref="EditMessageTextarea"></textarea>
+          <button className="solid green done-button" type="button" onClick={@bound 'updateMessage'} >DONE</button>
+          <button className="cancel-editing" type="button" onClick={@bound 'cancelEdit'} >CANCEL</button>
+

+        <ButtonWithMenu items={@getMenuItems()} showMenuForMouseAction={@state.showMenuForMouseAction}/>
+

+


Don't let the server die when a sponsored subscription's sponsor can't be found.

--- server/routes/stripe.coffee
+++ server/routes/stripe.coffee
@@ -161,7 +161,10 @@
           _.remove(stripeInfo.recipients, (s) -> s.userID is recipient.id)
           options =
             quantity: utils.getSponsoredSubsAmount(subscription.plan.amount, stripeInfo.recipients.length, stripeInfo.subscriptionID?)
-          console.log 'Updating sponsored subscription', stripeInfo.customerID, stripeInfo.sponsorSubscriptionID, options, 'from stripeInfo', stripeInfo, 'and subscription', subscription, 'for user', recipient.id, 'with sponsor', sponsor.id
+          unless stripeInfo.sponsorSubscriptionID
+            # TODO: fix #2786 error for a particular customer which doesn't have this
+            console.error "Couldn't find sponsorSubscriptionID from stripeInfo", stripeInfo, 'for customer', stripeInfo.customerID, 'with options', options, 'and subscription', subscription, 'for user', recipient.id, 'with sponsor', sponsor.id
+            return res.send(500, '')
           stripe.customers.updateSubscription stripeInfo.customerID, stripeInfo.sponsorSubscriptionID, options, (err, subscription) =>
             if err
               logStripeWebhookError(err)


Added Inspire command (#13)

Added Inspire command (#13)

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

--- Hubot/inspirobot.coffee
+++ Hubot/inspirobot.coffee
@@ -0,0 +1,29 @@
+# Description:
+#   Inspirational
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   inspire
+#
+# Known Issues:
+#   none
+#
+# Author:
+#   Riley Mills
+
+Util = require "util"
+
+module.exports = (robot) =>
+  robot.respond /inspire/i, (msg) ->
+    msg.http('http://inspirobot.me/api?generate=true')
+      .get() (err, res, body) ->
+        if err
+          msg.send "Encountered an error :( #{err}"
+          return
+        else
+          msg.send(body)


Update spec to match stricter maintenance of lastRenderedScreenRow

--- spec/app/editor-spec.coffee
+++ spec/app/editor-spec.coffee
@@ -1339,7 +1339,7 @@
         editor.attachToDom(heightInLines: 5)
         spyOn(editor, "scrollTo")

-      describe "when the change the precedes the first rendered row", ->
+      describe "when the change precedes the first rendered row", ->
         it "inserts and removes rendered lines to account for upstream change", ->
           editor.scrollToBottom()
           expect(editor.renderedLines.find(".line").length).toBe 7
@@ -1347,9 +1347,9 @@
           expect(editor.renderedLines.find(".line:last").text()).toBe buffer.lineForRow(12)

           buffer.change([[1,0], [3,0]], "1\n2\n3\n")
-          expect(editor.renderedLines.find(".line").length).toBe 8
+          expect(editor.renderedLines.find(".line").length).toBe 7
           expect(editor.renderedLines.find(".line:first").text()).toBe buffer.lineForRow(6)
-          expect(editor.renderedLines.find(".line:last").text()).toBe buffer.lineForRow(13)
+          expect(editor.renderedLines.find(".line:last").text()).toBe buffer.lineForRow(12)

       describe "when the change straddles the first rendered row", ->
         it "doesn't render rows that were not previously rendered", ->
@@ -1360,9 +1360,9 @@
           expect(editor.renderedLines.find(".line:last").text()).toBe buffer.lineForRow(12)

           buffer.change([[2,0], [7,0]], "2\n3\n4\n5\n6\n7\n8\n9\n")
-          expect(editor.renderedLines.find(".line").length).toBe 9
+          expect(editor.renderedLines.find(".line").length).toBe 7
           expect(editor.renderedLines.find(".line:first").text()).toBe buffer.lineForRow(6)
-          expect(editor.renderedLines.find(".line:last").text()).toBe buffer.lineForRow(14)
+          expect(editor.renderedLines.find(".line:last").text()).toBe buffer.lineForRow(12)

       describe "when the change straddles the last rendered row", ->
         it "doesn't render rows that were not previously rendered", ->


Fix parameter ordering

Fix parameter ordering

--- src/application-menu.coffee
+++ src/application-menu.coffee
@@ -9,7 +9,7 @@
   devMode: null
   menu: null

-  constructor: (@devMode, @version) ->
+  constructor: (@version, @devMode) ->
     @menu = Menu.buildFromTemplate @defaultTemplate()
     Menu.setApplicationMenu @menu

@@ -41,7 +41,7 @@
         item.metadata['windowItem'] = true unless /^application:/.test(item.command)
       @parseTemplate(item.submenu) if item.submenu

-  showDownloadUpdateItem: (version, quitAndUpdateCallback) ->
+  showDownloadUpdateItem: (newVersion, quitAndUpdateCallback) ->
     downloadUpdateItem = _.find @allItems(), (item) -> item.label == 'Install update'
     if downloadUpdateItem
       downloadUpdateItem.visible = true


named export should be wrapped in curly braces

--- blueprints/initializer/files/app/initializers/__name__.coffee
+++ blueprints/initializer/files/app/initializers/__name__.coffee
@@ -6,5 +6,5 @@
   name: '<%= dasherizedModuleName %>'
   initialize: initialize

-`export initialize`
+`export {initialize}`
 `export default <%= classifiedModuleName %>Initializer`


write gulpfile in CoffeScript

write gulpfile in CoffeScript

--- gulpfile.coffee
+++ gulpfile.coffee
@@ -0,0 +1,48 @@
+coffee     = require 'gulp-coffee'
+coffeelint = require 'gulp-coffeelint'
+connect    = require 'gulp-connect'
+gulp       = require 'gulp'
+rename     = require 'gulp-rename'
+sass       = require 'gulp-sass'
+svgSprite  = require 'gulp-svg-sprites'
+uglify     = require 'gulp-uglify'
+util       = require 'gulp-util'
+
+gulp.task 'assets', ->
+
+  gulp.src('index.html')
+    .pipe connect.reload()
+
+  gulp.src('./src/*.scss')
+    .pipe(sass())
+    .pipe(gulp.dest 'dist')
+    .pipe connect.reload()
+
+  gulp.src(['src/*.coffee', 'gulpfile.coffee'])
+    .pipe(coffeelint './coffeelint.json')
+    .pipe coffeelint.reporter()
+
+  gulp.src('src/*.coffee')
+    .pipe(coffee bare: true)
+    .on('error', util.log)
+    .pipe(gulp.dest 'dist' )
+    .pipe(rename suffix: '.min')
+    .pipe(uglify mangle: false)
+    .pipe(gulp.dest 'dist')
+    .pipe connect.reload()
+
+gulp.task 'server', -> connect.server livereload: true
+
+gulp.task 'watch', ->
+  gulp.watch [
+    'gulpfile.coffee'
+    'src/*'
+    'index.html'
+  ], ['assets']
+
+gulp.task 'default', [
+  'assets'
+  'server'
+  'watch'
+]
+


contributed RU localization

contributed RU localization

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

--- pivot.ru.coffee
+++ pivot.ru.coffee
@@ -0,0 +1,56 @@
+callWithJQuery = (pivotModule) ->
+    if typeof exports is "object" and typeof module is "object" # CommonJS
+        pivotModule require("jquery")
+    else if typeof define is "function" and define.amd # AMD
+        define ["jquery"], pivotModule
+    # Plain browser env
+    else
+        pivotModule jQuery
+
+callWithJQuery ($) ->
+    nf = $.pivotUtilities.numberFormat
+    tpl = $.pivotUtilities.aggregatorTemplates
+
+    frFmt =    nf(thousandsSep: " ", decimalSep: ",")
+    frFmtInt = nf(digitsAfterDecimal: 0, thousandsSep: " ", decimalSep: ",")
+    frFmtPct = nf(digitsAfterDecimal: 1, scaler: 100, suffix: "%", thousandsSep: " ", decimalSep: ",")
+
+    $.pivotUtilities.locales.ru =
+        localeStrings:
+            renderError: "Ошибка рендеринга страницы;.",
+            computeError: "Ошибка табличных расчетов;.",
+            uiRenderError: "Ошибка во время прорисовки и динамического расчета таблицы.",
+            selectAll: "Выбрать все",
+            selectNone: "Ничего не выбирать",
+            tooMany: "(Выбрано слишком много значений)",
+            filterResults: "Значение фильтра",
+            totals: "Всего",
+            vs: "на",
+            by: "с"
+
+        aggregators:
+            "Счет": tpl.count(frFmtInt),
+            "Счет уникальных": tpl.countUnique(frFmtInt),
+            "Список уникальных": tpl.listUnique(", "),
+            "Сумма": tpl.sum(frFmt),
+            "Сумма целых": tpl.sum(frFmtInt),
+            "Среднее": tpl.average(frFmt),
+            "Минимум": tpl.min(frFmt),
+            "Максимум": tpl.max(frFmt),
+            "Сумма по сумме": tpl.sumOverSum(frFmt),
+            "80% верхней границы": tpl.sumOverSumBound80(true, frFmt),
+            "80% нижней границы": tpl.sumOverSumBound80(false, frFmt),
+            "Доля по всему": tpl.fractionOf(tpl.sum(), "total", frFmtPct),
+            "Доля по строке": tpl.fractionOf(tpl.sum(), "row", frFmtPct),
+            "Доля по столбцу": tpl.fractionOf(tpl.sum(), "col", frFmtPct),
+            "Счет по всему": tpl.fractionOf(tpl.count(), "total", frFmtPct),
+            "Счет по строке": tpl.fractionOf(tpl.count(), "row", frFmtPct),
+            "Счет по столбцу": tpl.fractionOf(tpl.count(), "col", frFmtPct)
+
+        renderers:
+            "Таблица": $.pivotUtilities.renderers["Table"]
+            "График столбцы": $.pivotUtilities.renderers["Table Barchart"]
+            "Теплова карта": $.pivotUtilities.renderers["Heatmap"]
+            "Тепловая карта по строке": $.pivotUtilities.renderers["Row Heatmap"]
+            "Тепловая карта по столбцу": $.pivotUtilities.renderers["Col Heatmap"]
+


implement font watch and new private and public paths

--- app/templates/_Gulpfile.coffee
+++ app/templates/_Gulpfile.coffee
@@ -22,6 +22,7 @@
 cp 							= require 'child_process'
 spawn 					= cp.spawn
 rev 						= require 'gulp-rev'
+revReplace			= require 'gulp-rev-replace'

 # Extra
 extend 					= require "extend"
@@ -38,11 +39,11 @@
 #   $SASS
 #*------------------------------------*/
 gulp.task "sass", () ->
-  gulp.src([conf.path.scss + "/style.scss"])
+  gulp.src([conf.path.pvt.scss + "/style.scss"])
 		.pipe plumber()
 		.pipe cache(sass({errLogToConsole: true}))
 		.pipe remember()
-		.pipe gulp.dest(conf.path.css)
+		.pipe gulp.dest(conf.path.pvt.css)
 		.pipe reload({stream: true})

 #*------------------------------------*\
@@ -55,7 +56,7 @@
 # 	still need to find out if it does what i think
 #*------------------------------------*/
 gulp.task 'imagemin', () ->
-	return gulp.src(conf.path.img+'/*')
+	return gulp.src(conf.path.pvt.img+'/*')
 		.pipe cache(imagemin {
 			optimizationLevel: 3,
 			progressive: true,
@@ -69,7 +70,7 @@
 		})
 		.pipe rev()
 		.pipe remember()
-		.pipe gulp.dest conf.path.img
+		.pipe gulp.dest conf.path.pub.img
 		.pipe rev.manifest(conf.revManifest.path, conf.revManifest.opts)
 		.pipe gulp.dest('./')

@@ -86,7 +87,7 @@
 #   $RESTART
 # 	Taken from: http://noxoc.de/2014/06/25/reload-gulpfile-js-on-change/
 #*------------------------------------*/
-gulp.task 'auto-reload', () ->
+gulp.task 'auto_reload', () ->
 	process = undefined
 	restart = () ->
 		if process != undefined
@@ -101,11 +102,11 @@
 #   $COFFEE
 #*------------------------------------*/
 gulp.task "coffee", () ->
-	gulp.src [conf.path.coffee+"/**/*.coffee"]
+	gulp.src [conf.path.pvt.coffee+"/**/*.coffee"]
 		.pipe plumber()
 		.pipe cache(coffee({bare: true}).on('error', gutil.log))
 		.pipe remember()
-		.pipe gulp.dest(conf.path.js)
+		.pipe gulp.dest(conf.path.pvt.js)
 		.pipe reload({stream: true})

@@ -113,19 +114,21 @@
 #   $WATCH
 #*------------------------------------*/
 gulp.task "watch", () ->
-	gulp.watch conf.path.scss + "/**/*.scss", ["sass"]
-	gulp.watch conf.path.coffee + "/**/*.coffee", ["coffee", reload]
+	gulp.watch conf.path.pvt.scss + "/**/*.scss", ["sass"]
+	gulp.watch conf.path.pvt.coffee + "/**/*.coffee", ["coffee", reload]
+	gulp.watch conf.path.pvt.fnt + "/**/*", ['font']
+	gulp.watch conf.path.pvt.img + "/**/*", ['imagemin']

 #*------------------------------------*\
 #   $UGLIFY
 #*------------------------------------*/
 gulp.task "uglify", () ->
-	gulp.src [conf.path.js + "/main.js"]
+	gulp.src [conf.path.pvt.js + "/main.js"]
 	.pipe uglifyJs()
 	.pipe rev()
 	.pipe rename({suffix: '.min'})
-	.pipe gulp.dest(conf.path.js)
+	.pipe gulp.dest(conf.path.pub.js)
 	.pipe rev.manifest(conf.revManifest.path, conf.revManifest.opts)
 	.pipe gulp.dest('./')

@@ -138,9 +141,25 @@
 		.pipe minifyCSS({keepSpecialComments: 0})
 		.pipe rev()
 		.pipe rename({suffix: '.min'})
-		.pipe gulp.dest(conf.path.css)
+		.pipe gulp.dest(conf.path.pub.css)
 		.pipe rev.manifest(conf.revManifest.path, conf.revManifest.opts)
 		.pipe gulp.dest('./')
+
+
+#*------------------------------------*\
+#   $FONT REV
+#*------------------------------------*/
+gulp.task "font", () ->
+	gulp.src([conf.path.prv.fnt])
+		.pipe cache(rev())
+		.pipe remember()
+		.pipe gulp.dest(conf.path.pub.fnt)
+		.pipe rev.manifest(conf.revManifest.path, conf.revManifest.opts)
+		.pipe gulp.dest('./')
+
+
+gulp.task "rev_replave", () ->
+	gulp.src([])

 #*------------------------------------*\


add providerinterface.test.coffee

add providerinterface.test.coffee

error: pathspec 'workers/social/lib/social/models/computeproviders/providerinterface.test.coffee' did not match any file(s) known to git

--- workers/social/lib/social/models/computeproviders/providerinterface.test.coffee
+++ workers/social/lib/social/models/computeproviders/providerinterface.test.coffee
@@ -0,0 +1,33 @@
+JProviderInterface = require './providerinterface'
+
+{ expect
+  checkBongoConnectivity }         = require '../../../../testhelper'
+{ withConvertedUserAndCredential } = require '../../../../testhelper/models/computeproviders/credentialhelper'
+
+# this function will be called once before running any test
+beforeTests = -> before (done) ->
+
+  checkBongoConnectivity done
+
+
+# here we have actual tests
+runTests = -> describe 'workers.social.models.computeproviders.providerinterface', ->
+
+  describe '#fetchCredentialData()', ->
+
+    it 'it should be able fetch credential data ', (done) ->
+
+      withConvertedUserAndCredential ({ client, credential }) ->
+        JProviderInterface.fetchCredentialData credential, (err, credData) ->
+          expect(err).to.not.exist
+          expect(credData).to.be.an 'object'
+          expect(credData.meta).to.be.an 'object'
+          expect(credData.identifier).to.be.equal credential.identifier
+          done()
+
+
+
+beforeTests()
+
+runTests()
+


clio-26384 Remove useless test in thDisclosureContent

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/seanhealy/lib-themisui.git/'


fixing install app callback

fixing install app callback

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


Client: Sidebar: Added new getters for invitationWidget, leavingSharedMachinesWidget and sharedMachineListitems


Added F# syntax grammar This improves upon https://github.com/jbtule/language-fsharp It is a basic port from the one that is used by github, albeit this is not in plist format. Any improvements could be back-ported so that they can be used by github too.

error: pathspec 'src/fsharp/grammars/f#.cson' did not match any file(s) known to git

--- src/fsharp/grammars/f#.cson
+++ src/fsharp/grammars/f#.cson
@@ -0,0 +1,654 @@
+{
+  "fileTypes": [
+    "fs",
+    "fsi",
+    "fsx"
+  ],
+  "foldingStartMarker": "",
+  "foldingStopMarker": "",
+  "repository": {
+    "comments": {
+      "patterns": [
+        {
+          "match": "\\(\\*\\*?(\\*)\\)",
+          "captures": {
+            "1": {
+              "name": "comment.block.empty.fsharp"
+            }
+          },
+          "name": "comment.block.fsharp"
+        },
+        {
+          "end": "\\*\\)",
+          "begin": "\\(\\*[^\\)]",
+          "patterns": [
+            {
+              "include": "#comments"
+            }
+          ],
+          "name": "comment.block.fsharp"
+        },
+        {
+          "match": "\\/\\/(?:(?!\\*\\)).)*$",
+          "name": "comment.line.double-slash.fsharp"
+        }
+      ]
+    },
+    "type-generic": {
+      "patterns": [
+        {
+          "match": "\\'[a-zA-Z](?!\\')",
+          "name": "storage.type.generic.fsharp"
+        }
+      ]
+    },
+    "type-abbreviation": {
+      "patterns": [
+        {
+          "end": "$",
+          "begin": "\\s*(type)\\s+",
+          "beginCaptures": {
+            "1": {
+              "name": "keyword.other.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "match": "=|->",
+              "name": "keyword.other.fsharp"
+            },
+            {
+              "end": ">",
+              "begin": "<",
+              "patterns": [
+                {
+                  "match": "\\'[a-zA-Z]",
+                  "name": "storage.type.generic.fsharp"
+                }
+              ],
+              "name": "keyword.other.fsharp"
+            },
+            {
+              "match": "\\'[a-zA-Z]",
+              "name": "storage.type.generic.fsharp"
+            }
+          ]
+        }
+      ]
+    },
+    "structure": {
+      "patterns": [
+        {
+          "end": "\\)",
+          "begin": "\\(",
+          "patterns": [
+            {
+              "include": "$self"
+            }
+          ],
+          "name": "meta.paren-group.fsharp"
+        }
+      ]
+    },
+    "async-workflows": {
+      "patterns": [
+        {
+          "end": "(\\})",
+          "begin": "(async)(?=\\s+\\{)",
+          "beginCaptures": {
+            "1": {
+              "name": "storage.type.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "include": "$self"
+            }
+          ],
+          "name": "meta.sequence.definition.fsharp"
+        }
+      ]
+    },
+    "sequences": {
+      "patterns": [
+        {
+          "end": "(\\})",
+          "begin": "(seq)(?=\\s+\\{)",
+          "beginCaptures": {
+            "1": {
+              "name": "storage.type.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "include": "$self"
+            }
+          ],
+          "name": "meta.sequence.definition.fsharp"
+        }
+      ]
+    },
+    "method_calls": {
+      "patterns": [
+        {
+          "end": "(?=.)",
+          "begin": "(?<!\\w)([a-z]\\w*)(\\.)",
+          "applyEndPatternLast": 1,
+          "patterns": [
+            {
+              "match": "[A-Z]\\w*(\\.)",
+              "captures": {
+                "1": {
+                  "name": "punctuation.separator.method-call.fsharp"
+                }
+              },
+              "name": "meta.method.fsharp"
+            }
+          ],
+          "name": "meta.method-call.fsharp"
+        }
+      ]
+    },
+    "anonymous_functions": {
+      "patterns": [
+        {
+          "end": "(->)",
+          "begin": "\\b(fun)\\b",
+          "beginCaptures": {
+            "1": {
+              "name": "keyword.other.function-definition.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "include": "#variables"
+            }
+          ],
+          "endCaptures": {
+            "1": {
+              "name": "keyword.other.fsharp"
+            }
+          },
+          "name": "meta.function.anonymous"
+        }
+      ]
+    },
+    "modules": {
+      "patterns": [
+        {
+          "end": "(\\s|$)",
+          "begin": "\\b(namespace|module)\\s+([a-zA-Z][a-zA-Z0-9'_.]*)",
+          "beginCaptures": {
+            "1": {
+              "name": "keyword.other.fsharp"
+            },
+            "2": {
+              "name": "entity.name.section.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "match": "(\\.)([A-Z][a-zA-Z0-9'_]*)",
+              "captures": {
+                "1": {
+                  "name": "punctuation.separator.module-reference.fsharp"
+                },
+                "2": {
+                  "name": "support.other.module.fsharp"
+                }
+              },
+              "name": "support.other.module.fsharp"
+            }
+          ],
+          "name": "meta.module.namespace.fsharp"
+        },
+        {
+          "end": "(\\s|$)",
+          "begin": "\\b(open)\\s+([A-Z][a-zA-Z0-9'_]*)(?=(\\.[A-Z][a-zA-Z0-9_]*)*)",
+          "beginCaptures": {
+            "1": {
+              "name": "keyword.other.fsharp"
+            },
+            "2": {
+              "name": "support.other.module.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "match": "(\\.)([A-Z][a-zA-Z0-9'_]*)",
+              "captures": {
+                "1": {
+                  "name": "punctuation.separator.module-reference.fsharp"
+                },
+                "2": {
+                  "name": "support.other.module.fsharp"
+                }
+              },
+              "name": "support.other.module.fsharp"
+            }
+          ],
+          "name": "meta.module.open.fsharp"
+        },
+        {
+          "end": "(\\s|$)",
+          "begin": "^\\s*(module)\\s+([A-Z][a-zA-Z0-9'_]*)\\s*(=)\\s*([A-Z][a-zA-Z0-9'_]*)",
+          "beginCaptures": {
+            "1": {
+              "name": "keyword.other.module-definition.fsharp"
+            },
+            "2": {
+              "name": "entity.name.type.module.fsharp"
+            },
+            "3": {
+              "name": "punctuation.separator.module-definition.fsharp"
+            },
+            "4": {
+              "name": "support.other.module.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "match": "(\\.)([A-Z][a-zA-Z0-9'_]*)",
+              "captures": {
+                "1": {
+                  "name": "punctuation.separator.module-reference.fsharp"
+                },
+                "2": {
+                  "name": "support.other.module.fsharp"
+                }
+              },
+              "name": "support.other.module.fsharp"
+            }
+          ],
+          "name": "meta.module.alias.fsharp"
+        },
+        {
+          "end": "(?=.)",
+          "begin": "(?<!\\w)([A-Z][a-zA-Z0-9_]*)(\\.)",
+          "applyEndPatternLast": 1,
+          "beginCaptures": {
+            "1": {
+              "name": "support.other.module.fsharp"
+            },
+            "2": {
+              "name": "punctuation.separator.module-reference.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "match": "[A-Z][a-zA-Z0-9_]+(\\.)",
+              "captures": {
+                "1": {
+                  "name": "punctuation.separator.module-reference.fsharp"
+                }
+              },
+              "name": "support.other.module.fsharp"
+            }
+          ],
+          "name": "meta.module.reference.fsharp"
+        }
+      ]
+    },
+    "keywords": {
+      "patterns": [
+        {
+          "end": "(\\s|$)",
+          "begin": "^\\s*#\\s*(light|if|else|endif|r|I|load|time|help|quit)\\b",
+          "name": "meta.preprocessor.fsharp"
+        },
+        {
+          "match": "\\byield!?",
+          "name": "keyword.other.fsharp"
+        },
+        {
+          "match": "\\b(try|finally|new|in|as|if|then|else|elif|raise|for|begin|end|match|with|when|type|inherit|null|do|while)\\b",
+          "name": "keyword.other.fsharp"
+        },
+        {
+          "match": "\\+|-|/|%|\\*\\*|\\*",
+          "name": "keyword.arithmetic.fsharp"
+        },
+        {
+          "match": "(\\|>|\\|\\?>|\\->|\\<\\-|:>|:|\\[|\\]|\\;|_|&&)",
+          "name": "keyword.operator.name"
+        },
+        {
+          "match": "\\|",
+          "name": "keyword.other.fsharp"
+        },
+        {
+          "match": "=|>=|<=|<>|<|>",
+          "name": "keyword.comparison.fsharp"
+        }
+      ]
+    },
+    "attributes": {
+      "patterns": [
+        {
+          "end": "\\>\\]",
+          "begin": "\\[\\<",
+          "patterns": [
+            {
+              "include": "$self"
+            }
+          ],
+          "name": "support.function.attribute.fsharp"
+        }
+      ]
+    },
+    "constants": {
+      "patterns": [
+        {
+          "match": "\\b(true|false)\\b",
+          "name": "constant.language.boolean.fsharp"
+        },
+        {
+          "match": "\\b(None|Some)\\b",
+          "name": "constant.language.unit.fsharp"
+        },
+        {
+          "match": "\\(\\)",
+          "name": "constant.language.option.fsharp"
+        },
+        {
+          "match": "\\b-?[0-9][0-9_]*((\\.([0-9][0-9_]*([eE][+-]??[0-9][0-9_]*)?)?)|([eE][+-]??[0-9][0-9_]*))",
+          "name": "constant.numeric.floating-point.fsharp"
+        },
+        {
+          "match": "\\b(-?((0(x|X)[0-9a-fA-F][0-9a-fA-F_]*)|(0(o|O)[0-7][0-7_]*)|(0(b|B)[01][01_]*)|([0-9][0-9_]*)))",
+          "name": "constant.numeric.integer.nativeint.fsharp"
+        }
+      ]
+    },
+    "strings": {
+      "patterns": [
+        {
+          "end": "(\"\"\")",
+          "begin": "(\"\"\")",
+          "beginCaptures": {
+            "1": {
+              "name": "punctuation.definition.string.begin.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "match": "\\\\$[ \\t]*",
+              "name": "punctuation.separator.string.ignore-eol.fsharp"
+            },
+            {
+              "match": "\\\\([\\\\'ntbr]|u[a-fA-F0-9]{4}|u[a-fA-F0-9]{8})",
+              "name": "constant.character.string.escape.fsharp"
+            },
+            {
+              "match": "\\\\(?![\\\\'ntbr]|u[a-fA-F0-9]{4}|u[a-fA-F0-9]{8}).",
+              "name": "invalid.illeagal.character.string.fsharp"
+            }
+          ],
+          "endCaptures": {
+            "1": {
+              "name": "punctuation.definition.string.end.fsharp"
+            }
+          },
+          "name": "string.quoted.triple.fsharp"
+        },
+        {
+          "end": "(?<!\")(\")(?=[^\"])",
+          "begin": "(@)(\")",
+          "beginCaptures": {
+            "1": {
+              "name": "keyword.other.fsharp"
+            },
+            "2": {
+              "name": "punctuation.definition.string.begin.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "match": "(\"\")",
+              "name": "constant.character.escape.fsharp"
+            }
+          ],
+          "endCaptures": {
+            "1": {
+              "name": "punctuation.definition.string.end.fsharp"
+            }
+          },
+          "name": "string.quoted.double.verbatim.fsharp"
+        },
+        {
+          "end": "(\")",
+          "begin": "(?=[^\\\\])(\")",
+          "beginCaptures": {
+            "1": {
+              "name": "punctuation.definition.string.begin.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "include": "#string-escapes"
+            },
+            {
+              "include": "#string-format-specs"
+            },
+            {
+              "match": "\\\\$[ \\t]*",
+              "name": "punctuation.separator.string.ignore-eol.fsharp"
+            }
+          ],
+          "endCaptures": {
+            "1": {
+              "name": "punctuation.definition.string.end.fsharp"
+            }
+          },
+          "name": "string.quoted.double.fsharp"
+        }
+      ]
+    },
+    "variables": {
+      "patterns": [
+        {
+          "include": "#type-generic"
+        },
+        {
+          "match": "\\(\\)",
+          "name": "variable.parameter.unit.fsharp"
+        },
+        {
+          "match": "(?<=:)\\s*[a-zA-Z][\\w.']*",
+          "name": "storage.type.name.fsharp"
+        },
+        {
+          "match": "[a-zA-Z]\\w*",
+          "name": "variable.parameter.fsharp"
+        }
+      ]
+    },
+    "definition": {
+      "patterns": [
+        {
+          "match": "\\b(let!?)\\s+(?:[_a-zA-Z][a-zA-Z_,]*|``.*``)(?:\\s*,\\s*(?:[_a-zA-Z][a-zA-Z_,]*|``.*``))*\\s*(=)",
+          "captures": {
+            "1": {
+              "name": "storage.type.function.fsharp"
+            },
+            "3": {
+              "name": "keyword.operator.assignment.fsharp"
+            }
+          },
+          "name": "meta.expression.fsharp"
+        },
+        {
+          "end": "(=)|$",
+          "begin": "(let)\\s+(\\(\\|)",
+          "beginCaptures": {
+            "1": {
+              "name": "storage.type.function.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "match": "([a-zA-Z0-9_]+?)(\\|\\))|([a-zA-Z0-9_]+?)(\\|)",
+              "captures": {
+                "1": {
+                  "name": "constant.other.fsharp"
+                },
+                "3": {
+                  "name": "constant.other.fsharp"
+                }
+              },
+              "name": "meta.active-expression.fsharp"
+            },
+            {
+              "include": "#variables"
+            }
+          ],
+          "endCaptures": {
+            "1": {
+              "name": "keyword.operator.assignment.fsharp"
+            }
+          },
+          "name": "meta.active-expression.fsharp"
+        },
+        {
+          "end": "(=)|$",
+          "begin": "\\b(ref|val|val|let|and|member|override|use)\\s?(rec|inline|mutable)?(\\s+\\(?([a-zA-Z.\\|_][a-zA-Z0-9.|_]*)\\)?\\w*)\\b",
+          "beginCaptures": {
+            "1": {
+              "name": "storage.type.function.fsharp"
+            },
+            "2": {
+              "name": "keyword.other.function-recursive.fsharp"
+            },
+            "3": {
+              "name": "entity.name.function.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "include": "#variables"
+            }
+          ],
+          "endCaptures": {
+            "1": {
+              "name": "keyword.operator.assignment.fsharp"
+            }
+          },
+          "name": "meta.binding.fsharp"
+        },
+        {
+          "include": "#sequences"
+        },
+        {
+          "include": "#async-workflows"
+        }
+      ]
+    },
+    "string-escapes": {
+      "patterns": [
+        {
+          "match": "\\\\[bnrt\\\\\"']",
+          "name": "constant.character.escape.fsharp"
+        },
+        {
+          "match": "\\\\(u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})",
+          "name": "constant.character.escape.unicode-sequence.fsharp"
+        },
+        {
+          "match": "\\\\.",
+          "name": "invalid.illegal.character.string.fsharp"
+        }
+      ]
+    },
+    "characters": {
+      "patterns": [
+        {
+          "end": "(')",
+          "begin": "(?<!\\w)(')",
+          "beginCaptures": {
+            "1": {
+              "name": "punctuation.definition.string.begin.fsharp"
+            }
+          },
+          "patterns": [
+            {
+              "name": "constant.character.fsharp"
+            },
+            {
+              "include": "#string-escapes"
+            },
+            {
+              "match": ".([^']*)",
+              "captures": {
+                "1": {
+                  "name": "invalid.illegal.escape.fsharp"
+                }
+              }
+            }
+          ],
+          "endCaptures": {
+            "1": {
+              "name": "punctuation.definition.string.end.fsharp"
+            }
+          },
+          "name": "string.quoted.single.fsharp"
+        }
+      ]
+    },
+    "string-format-specs": {
+      "patterns": [
+        {
+          "match": "%[-\\+0 #]?[bcsdiuxXoeEfFgGeEMOAat]",
+          "name": "constant.character.format.specification.fsharp"
+        },
+        {
+          "match": "(%\\+A)",
+          "name": "constant.character.format.specification.fsharp"
+        }
+      ]
+    }
+  },
+  "uuid": "6017A74A-C6EA-47A0-8DF4-E59C931316FA",
+  "patterns": [
+    {
+      "include": "#comments"
+    },
+    {
+      "include": "#type-abbreviation"
+    },
+    {
+      "include": "#type-generic"
+    },
+    {
+      "include": "#constants"
+    },
+    {
+      "include": "#structure"
+    },
+    {
+      "include": "#attributes"
+    },
+    {
+      "include": "#characters"
+    },
+    {
+      "include": "#strings"
+    },
+    {
+      "include": "#definition"
+    },
+    {
+      "include": "#method_calls"
+    },
+    {
+      "include": "#modules"
+    },
+    {
+      "include": "#anonymous_functions"
+    },
+    {
+      "include": "#keywords"
+    }
+  ],
+  "name": "F#",
+  "scopeName": "source.fsharp"
+}


Package server API file w/header

Package server API file w/header

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


Speculative fix for hapi annoyance.

Speculative fix for hapi annoyance.

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


seeding teams

seeding teams

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


+ more than one </script> tag in username no longer breaks the page. (aka. Javascript never ceases to surprise me)

--- server_setup.coffee
+++ server_setup.coffee
@@ -92,7 +92,7 @@
   fs.readFile path.join(__dirname, 'public', 'main.html'), 'utf8', (err, data) ->
     log.error "Error modifying main.html: #{err}" if err
     # insert the user object directly into the html so the application can have it immediately. Sanitize </script>
-    data = data.replace('"userObjectTag"', JSON.stringify(UserHandler.formatEntity(req, req.user)).replace('/', '\\/'))
+    data = data.replace('"userObjectTag"', JSON.stringify(UserHandler.formatEntity(req, req.user)).replace(/\//g, '\\/'))
     res.send data

 setupFacebookCrossDomainCommunicationRoute = (app) ->


clarified instruction

clarified instruction

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


Debugging iphone submit problem

Debugging iphone submit problem

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/robb-broome/jinglepie.git/'


Disable some of the toolbar items

Disable some of the toolbar items

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


problem coffeescript

problem coffeescript

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

--- app/assets/javascripts/problems.coffee
+++ app/assets/javascripts/problems.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/


Fixed mailto link/anything else inside popover clicking, now wont hide popover by default

--- app/assets/javascripts/users.js.coffee
+++ app/assets/javascripts/users.js.coffee
@@ -46,9 +46,11 @@

   $(document).click((e)->
     if(isVisible & clickedAway)
-      toggle_popover(false, $('.comment-user-name'))
-      isVisible = false
-      clickedAway = false
+      target = e.target
+      if !$(target).closest(".popover").length
+        toggle_popover(false, $('.comment-user-name'))
+        isVisible = false
+        clickedAway = false
     else
       clickedAway = true
   )


[optimizer] prototype dead-code elimination

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


New filter for ArchiveUrl

New filter for ArchiveUrl

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


Quick fix LevelSessions require error

Quick fix LevelSessions require error

In areas of the site that do not have lib/aether_utils, the require broke because it's
fetched only sometimes through the ModuleLoader.

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


Use TextEditor::onDidChangeCursorPosition in spec

--- spec/text-editor-component-spec.coffee
+++ spec/text-editor-component-spec.coffee
@@ -728,7 +728,7 @@
       expect(cursorNodes[0].style['-webkit-transform']).toBe "translate(#{10 * charWidth}px, #{4 * lineHeightInPixels}px)"
       expect(cursorNodes[1].style['-webkit-transform']).toBe "translate(#{11 * charWidth}px, #{8 * lineHeightInPixels}px)"

-      wrapperView.on 'cursor:moved', cursorMovedListener = jasmine.createSpy('cursorMovedListener')
+      editor.onDidChangeCursorPosition cursorMovedListener = jasmine.createSpy('cursorMovedListener')
       cursor3.setScreenPosition([4, 11], autoscroll: false)
       nextAnimationFrame()
       expect(cursorNodes[0].style['-webkit-transform']).toBe "translate(#{11 * charWidth}px, #{4 * lineHeightInPixels}px)"


Fix page titles containing escaped characters

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/grantovich/CSH-WebNews.git/'


Added pane abstract class.

Added pane abstract class.


Hardcoded writer URL removed

Hardcoded writer URL removed

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


Tests: Activity: Others: Added extra essertion.

--- client/test/lib/activity/others.coffee
+++ client/test/lib/activity/others.coffee
@@ -107,6 +107,7 @@

     browser
       .refresh()
+      .waitForElementVisible   '[testpath=ActivityListItemView]', 20000
       .click                   '[testpath="public-feed-link/Activity/Topic/public"]'
       .waitForElementVisible   '[testpath=ActivityInputView]', 10000
       .waitForElementVisible   mostLikeSelector, 20000


Tests: Helpers: Fixed openAccountPage helper.


minor: cosmetics

minor: cosmetics

--- client/ide/lib/views/chat/idechatview.coffee
+++ client/ide/lib/views/chat/idechatview.coffee
@@ -1,8 +1,9 @@
 kd                  = require 'kd'
+KDView              = kd.View
+KDTabView           = kd.TabView
+KDLoaderView        = kd.LoaderView
 KDCustomHTMLView    = kd.CustomHTMLView
-KDLoaderView        = kd.LoaderView
-KDTabView           = kd.TabView
-KDView              = kd.View
+
 CustomLinkView      = require 'app/customlinkview'
 IDEChatMessagePane  = require './idechatmessagepane'
 IDEChatSettingsPane = require './idechatsettingspane'


Collaboration: chathead filemenu logic improvement

--- client/ide/views/statusbar/avatarview.coffee
+++ client/ide/views/statusbar/avatarview.coffee
@@ -1,6 +1,7 @@
 class IDE.StatusBarAvatarView extends AvatarView

   INTENT_DELAY = 177
+  MENU         = null

   constructor: (options = {}, data) ->

@@ -9,6 +10,7 @@
     super options, data

     @intentTimer = null
+    @nickname    = @getOptions().origin

   click: (event) ->
@@ -18,19 +20,19 @@

     return no

-
   mouseEnter: -> @intentTimer = KD.utils.wait INTENT_DELAY, @bound 'showMenu'

   mouseLeave: -> KD.utils.killWait @intentTimer  if @intentTimer

   showMenu: ->

-    return  if @menu
+    return  if MENU and MENU.getOptions().nickname is @nickname
+
+    MENU.destroy()  if MENU

     { appManager } = KD.singletons
     { rtm }        = appManager.getFrontApp()
-    { nickname }   = @getData().profile
-    changes        = rtm.getFromModel("#{nickname}Snapshot")?.values() or []
+    changes        = rtm.getFromModel("#{@nickname}Snapshot")?.values() or []
     menuItems      = {}
     menuData       =
       terminals : []
@@ -71,22 +73,23 @@

       { watchMap, sessionHost } = collaborationData

-      isWatching  = watchMap.indexOf(nickname) > -1
+      isWatching  = watchMap.indexOf(@nickname) > -1
       title       = if isWatching then 'Unwatch' else 'Watch'
       menuWidth   = 172

       menuItems[title] =
         title    : title
-        callback : (item, e) => @setWatchState isWatching, nickname, item
+        callback : (item, e) => @setWatchState isWatching, @nickname, item

       if sessionHost is KD.nick()
         menuItems.Kick =
           title     : 'Kick'
           callback  : =>
-            @menu?.destroy()
+            MENU?.destroy()
             KD.singletons.appManager.tell 'IDE', 'kickParticipant', @getData()

-      @menu = new KDContextMenu
+      MENU = new KDContextMenu
+        nickname    : @nickname
         cssClass    : 'dark statusbar-files'
         event       : event
         delegate    : this
@@ -102,14 +105,14 @@

       KD.utils.wait 200, =>
-        h = @menu.getHeight()
-        w = @menu.getWidth()
+        h = MENU.getHeight()
+        w = MENU.getWidth()
         top  = -h
         left = @getWidth()/2 - w/2
-        @menu.setOption 'offset', {left, top}
-        @menu.positionContextMenu()
+        MENU.setOption 'offset', {left, top}
+        MENU.positionContextMenu()

-      @menu.once 'KDObjectWillBeDestroyed', => @menu = null
+      MENU.once 'KDObjectWillBeDestroyed', => MENU = null

   setWatchState: (isWatching, nickname, item) ->
@@ -130,6 +133,6 @@

   destroy: ->

-    @menu?.destroy()
+    MENU?.destroy()

     super


FinderPane: Remove multiple event listener for file opening.


Search completion; fix autoselect on empty vomnibar.

--- pages/vomnibar.coffee
+++ pages/vomnibar.coffee
@@ -91,6 +91,8 @@
       @selection = 0 if @completions[0].autoSelect and not @previousAutoSelect
       @selection = -1 if @previousAutoSelect and not @completions[0].autoSelect
       @previousAutoSelect = @completions[0].autoSelect
+    else
+      @previousAutoSelect = null

     # For suggestions from search-engine completion, we copy the suggested text into the input when selected,
     # and revert when not.  This allows the user to select a suggestion and then continue typing.


Don't update the DisplayBuffer when a fold's marker changes

Because we don't currently allow for direct manipulation of fold
marker ranges, if a fold's marker changes it will be because of a
buffer change. This buffer change will bubble to the display buffer
anyway, where the screen line update will account for the change to
the fold's marker range.

--- src/app/fold.coffee
+++ src/app/fold.coffee
@@ -14,10 +14,6 @@
   constructor: (@displayBuffer, @marker) ->
     @displayBuffer.foldsByMarkerId[@marker.id] = this
     @updateDisplayBuffer()
-    @marker.on 'changed', (e) =>
-      oldRange = new Range(e.oldHeadBufferPosition, e.oldTailBufferPosition)
-      newRange = new Range(e.newHeadBufferPosition, e.newTailBufferPosition)
-      @updateDisplayBuffer() unless newRange.isEqual(oldRange)
     @marker.on 'destroyed', => @destroyed()

   # Returns whether this fold is contained within another fold


suppressing errors from cancelling startup

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


responsive table header position corrected

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


fix clone function

fix clone function

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


Tests: Add test for pbv_1000

Tests: Add test for pbv_1000

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

--- test/server/conditions/pbv_1000_spec.coffee
+++ test/server/conditions/pbv_1000_spec.coffee
@@ -0,0 +1,31 @@
+require '../../helpers'
+
+{BattleServer} = require('../../../server/server')
+gen = require('../../../server/generations')
+{User} = require('../../../server/user')
+{Conditions} = require '../../../shared/conditions'
+{Factory} = require '../../factory'
+should = require('should')
+
+describe 'Validations: PBV 1000', ->
+  it "returns an error if the team is over 1000 PBV", ->
+    server = new BattleServer()
+    user = new User("Batman")
+    other = new User("Robin")
+    challengeeId = other.id
+    generation = 'xy'
+    team = [ Factory("Arceus", moves: [ "Recover" ]) ]
+    conditions = [ Conditions.PBV_1000 ]
+
+    server.validateTeam(team, generation, conditions).should.not.be.empty
+
+  it "returns no error if the team is under 1000 PBV", ->
+    server = new BattleServer()
+    user = new User("Batman")
+    other = new User("Robin")
+    challengeeId = other.id
+    generation = 'xy'
+    team = [ Factory("Magikarp", moves: [ "Splash" ]) ]
+    conditions = [ Conditions.PBV_1000 ]
+
+    server.validateTeam(team, generation, conditions).should.be.empty


Remove check of params of loadHistory

Remove check of params of loadHistory

--- server/methods/loadHistory.coffee
+++ server/methods/loadHistory.coffee
@@ -2,9 +2,9 @@
 	loadHistory: (rid, end, limit=20, ls) ->

 		check rid, String
-		check end, Match.Optional(Number)
+		# check end, Match.Optional(Number)
 		check limit, Number
-		check ls, Match.Optional(Number)
+		# check ls, Match.Optional(Number)

 		if not Meteor.userId()
 			throw new Meteor.Error 'error-invalid-user', 'Invalid user', { method: 'loadHistory' }


Add back home routes specs

Add back home routes specs

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

--- apps/home/test/routes.coffee
+++ apps/home/test/routes.coffee
@@ -0,0 +1,116 @@
+sinon = require 'sinon'
+Backbone = require 'backbone'
+{ extend } = require 'underscore'
+{ fabricate } = require 'antigravity'
+rewire = require 'rewire'
+routes = rewire '../routes'
+
+describe 'Home routes', ->
+  beforeEach ->
+    sinon.stub Backbone, 'sync'
+    @req =
+      body: {}
+      query: {}
+      get: @getStub = sinon.stub()
+      cookies: {}
+
+    @res =
+      locals: sd: {}
+      render: sinon.stub()
+      redirect: sinon.stub()
+      cookie: @cookieStub = sinon.stub()
+
+  afterEach ->
+    Backbone.sync.restore()
+
+  describe '#index', ->
+
+    describe 'logged out', ->
+      describe 'first time', ->
+        it 'renders the home page with hero units + welcome hero unit at the front', ->
+          Backbone.sync
+            .onCall 0
+            .yieldsTo 'success', [fabricate 'site_hero_unit']
+            .onCall 1
+            .yieldsTo 'success', [fabricate 'featured_link']
+            .onCall 2
+            .yieldsTo 'success', [fabricate 'featured_link']
+
+          routes.index @req, @res
+            .then =>
+              @res.render.args[0][0].should.equal 'index'
+              @res.render.args[0][1].heroUnits.at(0).get 'description'
+                .should.equal 'Sign up to get updates on your favorite artists'
+              @res.render.args[0][1].heroUnits.at(1).get 'description'
+                .should.equal 'My hero'
+              @res.cookie.args[0][0].should.equal 'hide-welcome-hero'
+              @res.cookie.args[0][1].should.equal '1'
+
+      describe 'after first time', ->
+        it 'renders the home page with hero units + welcome hero unit at the end', ->
+          @req.cookies = 'hide-welcome-hero': '1'
+
+          Backbone.sync
+            .onCall 0
+            .yieldsTo 'success', [fabricate 'site_hero_unit']
+            .onCall 1
+            .yieldsTo 'success', [fabricate 'featured_link']
+            .onCall 2
+            .yieldsTo 'success', [fabricate 'featured_link']
+
+          routes.index @req, @res
+            .then =>
+              @res.render.args[0][0].should.equal 'index'
+              @res.render.args[0][1].heroUnits.last().get 'description'
+                .should.equal 'Sign up to get updates on your favorite artists'
+
+    describe 'logged in', ->
+      it 'renders the homepage without the welcome hero unit', ->
+        Backbone.sync
+          .onCall 0
+          .yieldsTo 'success', [fabricate 'site_hero_unit']
+          .onCall 1
+          .yieldsTo 'success', [fabricate 'featured_link']
+
+        routes.index extend({ user: 'existy' }, @req), @res
+          .then =>
+            @res.render.args[0][0].should.equal 'index'
+            @res.render.args[0][1].heroUnits.first().get 'description'
+              .should.equal 'My hero'
+
+  describe '#redirectToSignup', ->
+    it 'redirects to signup', ->
+      routes.redirectToSignup @req, @res
+      @res.redirect.args[0][0].should.equal '/sign_up'
+
+  describe '#redirectLoggedInHome', ->
+    it 'redirects logged in users home', ->
+      @req.user = {}
+      routes.redirectLoggedInHome @req, @res
+      @res.redirect.args[0][0].should.equal '/'
+
+    it 'redirects logged in users to redirect location', ->
+      @req.query['redirect_uri'] = '/awesome-fair'
+      @req.user = {}
+      routes.redirectLoggedInHome @req, @res
+      @res.redirect.args[0][0].should.equal '/awesome-fair'
+
+    it 'redirects logged in users to redirect location', ->
+      @req.body['redirect-to'] = '/awesome-fair'
+      @req.user = {}
+      routes.redirectLoggedInHome @req, @res
+      @res.redirect.args[0][0].should.equal '/awesome-fair'
+
+    it 'redirects logged in users to home if they log in from /log_in', ->
+      @getStub.returns '/log_in'
+      @req.url = '/log_in'
+      @req.user = {}
+      routes.redirectLoggedInHome @req, @res
+      @res.redirect.args[0][0].should.equal '/'
+
+    it 'redirects logged in users to home if they log in from /sign_up', ->
+      @getStub.returns '/sign_up'
+      @req.url = '/sign_up'
+      @req.user = {}
+      routes.redirectLoggedInHome @req, @res
+      @res.redirect.args[0][0].should.equal '/'


Accept _ in git branch when installing app

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


Export Exam in a global scope

Export Exam in a global scope

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/NightingaleStudio/exam.js.git/'


Disable submit button on save click

Disable submit button on save click

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


add Array.insert()

add Array.insert()

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