Add the simplest resize fix that will work.

--- src/editor-component.coffee
+++ src/editor-component.coffee
@@ -176,6 +176,7 @@
     @updateParentViewFocusedClassIfNeeded(prevState)
     @measureScrollbars() if @measuringScrollbars
     @measureLineHeightAndCharWidthsIfNeeded(prevState)
+    @requestScrollViewMeasurement()
     @props.parentView.trigger 'editor:display-updated'

   requestUpdate: ->
@@ -266,7 +267,6 @@
     node.addEventListener 'focus', @onFocus # For some reason, React's built in focus events seem to bubble

     scrollViewNode = @refs.scrollView.getDOMNode()
-    scrollViewNode.addEventListener 'overflowchanged', @onScrollViewOverflowChanged
     scrollViewNode.addEventListener 'scroll', @onScrollViewScroll
     window.addEventListener('resize', @onWindowResize)


Fix typo

Fix typo

--- src/editor-component.coffee
+++ src/editor-component.coffee
@@ -8,7 +8,7 @@
 SubscriberMixin = require './subscriber-mixin'

 module.exports =
-EditorCompont = React.createClass
+EditorComponent = React.createClass
   displayName: 'EditorComponent'
   mixins: [SubscriberMixin]


Add raspberry-pi-temp.coffee

Add raspberry-pi-temp.coffee

error: pathspec 'scripts/raspberry-pi-temp.coffee' did not match any file(s) known to git

--- scripts/raspberry-pi-temp.coffee
+++ scripts/raspberry-pi-temp.coffee
@@ -0,0 +1,36 @@
+# Description:
+#   RaspberryPiの温度に関するコマンドです
+#
+# Commands:
+#   RaspberryPi getTemp - RaspberryPiの現在の温度を返す
+#
+# Authors:
+#   S--Minecraft
+#	http://www.h4.dion.ne.jp/~unkai/js/js03.html
+#
+# License;
+#   Copyright (c) 2014 snowbit.
+#   Released under the Apache v2 license
+#   https://github.com/snowbit/snowbit/blob/master/LICENSE
+
+
+var wsh = new ActiveXObject("WScript.Shell");
+
+function withExecCommand(cmd, func) {
+	var exec = wsh.exec(cmd);
+	while (!exec.StdOut.AtEndOfStream) {
+		func(exec.StdOut.ReadLine());
+	}
+	return exec.ExitCode;
+}
+
+function execCommand(cmd) {
+	return withExecCommand(cmd, function (line) { WScript.Echo(line);});
+}
+
+var Temp = execCommand("cmd $ cat /sys/class/thermal/thermal_zone0/temp");
+var TempC = (Temp/1000)
+
+module.exports = (robot) ->
+  robot.respond /RaspberryPi getTemp/i, (msg) ->
+      msg.reply "現在のRaspberryPiの温度は" + TempC + "です。";


Add sharing routes

Add sharing routes

Conflicts:
	server/controllers/routes.coffee

--- server/controllers/routes.coffee
+++ server/controllers/routes.coffee
@@ -4,26 +4,37 @@
 requests = require './requests'
 attachments = require './attachments'
 binaries = require './binaries'
-connectors = require './connectors'
 indexer = require './indexer'
 mails = require './mails'
 user = require './user'
 account = require './accounts'
 access = require './access'
 replication = require './replication'
+sharing = require './sharing'
+filters = require './filters'

 utils = require '../middlewares/utils'

 module.exports =

     # Information page
-    '':  get: data.index
+    '':
+        get: [
+            data.index
+        ]
+

     # Data management
-    'data/': post: [
+    'data/':
+        post: [
             utils.checkPermissionsByBody
             data.encryptPassword
             data.create
+        ]
+    'data/search/':
+        post: [
+            utils.checkPermissionsFactory 'all'
+            indexer.search
         ]
     'data/:id/':
         get: [
@@ -49,30 +60,39 @@
             utils.lockRequest
             utils.getDoc
             utils.checkPermissionsByDoc
-            data.delete
-            utils.unlockRequest
-        ]
-    'data/exist/:id/': get: data.exist
-    'data/upsert/:id/': put: [
-        utils.lockRequest
-        utils.checkPermissionsByBody
-        data.encryptPassword
-        data.upsert
-        utils.unlockRequest
-    ]
-    'data/merge/:id/': put: [
-        utils.lockRequest
-        utils.checkPermissionsByBody
-        utils.getDoc
-        utils.checkPermissionsByDoc
-        data.encryptPassword
-        data.merge
-        utils.unlockRequest
-    ]
+            data.softdelete
+            utils.unlockRequest
+        ]
+    'data/exist/:id/':
+        get: [
+            data.exist
+        ]
+    'data/upsert/:id/':
+        put: [
+            utils.lockRequest
+            utils.checkPermissionsByBody
+            data.encryptPassword
+            data.upsert
+            utils.unlockRequest
+        ]
+    'data/merge/:id/':
+        put: [
+            utils.lockRequest
+            utils.checkPermissionsByBody
+            utils.getDoc
+            utils.checkPermissionsByDoc
+            data.encryptPassword
+            data.merge
+            utils.unlockRequest
+        ]
+

     # Requests management
     'request/:type/:req_name/':
-        post: [utils.checkPermissionsByType, requests.results]
+        post: [
+            utils.checkPermissionsByType
+            requests.results
+        ]
         put: [
             utils.checkPermissionsByType
             utils.lockRequest
@@ -85,28 +105,43 @@
             requests.remove
             utils.unlockRequest
         ]
-    'request/:type/:req_name/destroy/': put: [
-        utils.checkPermissionsByType
-        requests.removeResults
-    ]
+    'request/:type/:req_name/destroy/':
+        put: [
+            utils.checkPermissionsByType
+            requests.removeResults
+        ]
+

     # Tags API
-    'tags': get: requests.tags
+    'tags':
+        get: [
+            requests.tags
+        ]
+

     # Doctypes API
-    'doctypes': get: requests.doctypes
+    'doctypes':
+        get: [
+            requests.doctypes
+        ]
+

     # File management
     # attachment API is deprecated
-    'data/:id/attachments/': post: [
-        utils.lockRequest
-        utils.getDoc
-        utils.checkPermissionsByDoc
-        attachments.add
-        utils.unlockRequest
-    ]
+    'data/:id/attachments/':
+        post: [
+            utils.lockRequest
+            utils.getDoc
+            utils.checkPermissionsByDoc
+            attachments.add
+            utils.unlockRequest
+        ]
     'data/:id/attachments/:name':
-        get: [utils.getDoc, utils.checkPermissionsByDoc, attachments.get]
+        get: [
+            utils.getDoc
+            utils.checkPermissionsByDoc
+            attachments.get
+        ]
         delete: [
             utils.lockRequest
             utils.getDoc
@@ -114,24 +149,28 @@
             attachments.remove
             utils.unlockRequest
         ]
-
-    'data/:id/binaries/convert': get: [
-        utils.lockRequest
-        utils.getDoc
-        utils.checkPermissionsByDoc
-        binaries.convert
-        utils.unlockRequest
-    ]
-
-    'data/:id/binaries/': post: [
-        utils.lockRequest
-        utils.getDoc
-        utils.checkPermissionsByDoc
-        binaries.add
-        utils.unlockRequest
-    ]
+    'data/:id/binaries/convert':
+        get: [
+            utils.lockRequest
+            utils.getDoc
+            utils.checkPermissionsByDoc
+            binaries.convert
+            utils.unlockRequest
+        ]
+    'data/:id/binaries/':
+        post: [
+            utils.lockRequest
+            utils.getDoc
+            utils.checkPermissionsByDoc
+            binaries.add
+            utils.unlockRequest
+        ]
     'data/:id/binaries/:name':
-        get: [utils.getDoc, utils.checkPermissionsByDoc, binaries.get]
+        get: [
+            utils.getDoc
+            utils.checkPermissionsByDoc
+            binaries.get
+        ]
         delete: [
             utils.lockRequest
             utils.getDoc
@@ -140,85 +179,182 @@
             utils.unlockRequest
         ]

-    # Scrapper connectors
-    'connectors/bank/:name/': post: connectors.bank
-    'connectors/bank/:name/history': post: connectors.bankHistory

     # Access management
-    'access/': post: [utils.checkPermissionsFactory('access'), access.create]
+    'access/':
+        post: [
+            utils.checkPermissionsFactory 'access'
+            access.create
+        ]
     'access/:id/':
-        'put': [utils.checkPermissionsFactory('access'), access.update]
-        'delete': [
-            utils.checkPermissionsFactory('access')
+        put: [
+            utils.checkPermissionsFactory 'access'
+            access.update
+        ]
+        delete: [
+            utils.checkPermissionsFactory 'access'
             utils.lockRequest
             utils.getDoc
             access.remove
             utils.unlockRequest
         ]

+
+    # Filter Management
+    'filters/:id':
+        get: [
+            filters.checkDevice
+            utils.getDoc
+            data.find
+        ]
+        post: [
+            filters.checkDevice
+            filters.fixBody
+            data.create
+        ]
+        put: [
+            filters.checkDevice
+            filters.fixBody
+            utils.lockRequest
+            data.upsert
+            utils.unlockRequest
+        ]
+        delete: [
+            filters.checkDevice
+            utils.lockRequest
+            utils.getDoc
+            data.delete
+            utils.unlockRequest
+        ]
+
+
+    # Get attachment in a replication
+    # Remove route as replication/_local/:id
+    'replication/:id([^_]*)/:name*':
+        get: [
+            utils.getDoc
+            utils.checkPermissionsByDoc
+            replication.proxy
+        ]
     'replication/*':
-        'post': [
+        post: [
             utils.checkPermissionsPostReplication
             replication.proxy
         ]
-        'get': [
+        get: [
             replication.proxy
             # Permissions manage in request
         ]
-        'put':[
+        put:[
             utils.checkPermissionsPutReplication
             replication.proxy
         ]

+
     # Indexer management
     'data/index/clear-all/':
-        'delete': [
-            utils.checkPermissionsFactory('all')
+        delete: [
+            utils.checkPermissionsFactory 'all'
             indexer.removeAll
         ]
-
+    'data/index/status':
+        get: [
+            indexer.indexingStatus
+        ]
+    'data/index/define/:type':
+        post: [
+            utils.checkPermissionsByType
+            indexer.defineIndex
+        ]
     'data/index/:id':
         post: [
-            utils.lockRequest
-            utils.getDoc
-            utils.checkPermissionsByDoc
             indexer.index
-            utils.unlockRequest
-        ]
-        'delete': [
-            utils.lockRequest
-            utils.getDoc
-            utils.checkPermissionsByDoc
+        ]
+        delete: [
             indexer.remove
-            utils.unlockRequest
-        ]
-    'data/search/:type': post: [utils.checkPermissionsByType, indexer.search]
-    'data/search/': post: [utils.checkPermissionsFactory('all'), indexer.search]
+        ]
+    'data/search/:type':
+        post: [
+            utils.checkPermissionsByType
+            indexer.search
+        ]
+

     # Mail management
-    'mail/': post: [utils.checkPermissionsFactory('send mail'), mails.send]
-    'mail/to-user': post: [
-        utils.checkPermissionsFactory('send mail to user')
-        mails.sendToUser
-    ]
-    'mail/from-user': post: [
-        utils.checkPermissionsFactory('send mail from user')
-        mails.sendFromUser
-    ]
-
-    #User management
-    'user/': post: [utils.checkPermissionsFactory('User'), user.create]
-    'user/merge/:id': put: [
-        utils.lockRequest
-        utils.checkPermissionsFactory('User')
-        utils.getDoc
-        user.merge
-        utils.unlockRequest
-    ]
-
-    #Account management
+    'mail/':
+        post: [
+            utils.checkPermissionsFactory 'send mail'
+            mails.send
+        ]
+    'mail/to-user':
+        post: [
+            utils.checkPermissionsFactory 'send mail to user'
+            mails.sendToUser
+        ]
+    'mail/from-user':
+        post: [
+            utils.checkPermissionsFactory 'send mail from user'
+            mails.sendFromUser
+        ]
+
+
+    # User management
+    'user/':
+        post: [
+            utils.checkPermissionsFactory 'User'
+            user.create
+        ]
+    'user/merge/:id':
+        put: [
+            utils.lockRequest
+            utils.checkPermissionsFactory('User')
+            utils.getDoc
+            user.merge
+            utils.unlockRequest
+        ]
+
+
+    # Account management
     'accounts/password/':
-        post: [account.checkPermissions, account.initializeKeys]
-        put: [account.checkPermissions, account.updateKeys]
-    'accounts/reset/': delete: [account.checkPermissions, account.resetKeys]
-    'accounts/': delete: [account.checkPermissions, account.deleteKeys]
+        post: [
+            account.checkPermissions
+            account.initializeKeys
+        ]
+        put: [
+            account.checkPermissions
+            account.updateKeys
+        ]
+    'accounts/reset/':
+        delete: [
+            account.checkPermissions
+            account.resetKeys
+        ]
+
+
+    # Sharing management
+    'services/sharing/':
+        post: [
+            utils.checkPermissionsFactory 'sharing'
+            sharing.create
+            sharing.sendSharingRequests
+        ]
+    'services/sharing/:id':
+        delete: [
+            utils.checkPermissionsFactory 'sharing'
+            sharing.delete
+            sharing.stopReplications
+            sharing.sendDeleteNotifications
+        ]
+    'services/sharing/sendAnswer':
+        post: [
+            utils.checkPermissionsFactory 'sharing'
+            sharing.handleRecipientAnswer
+            sharing.sendAnswer
+        ]
+    'services/sharing/answer':
+        post: [
+            utils.checkPermissionsFactory 'sharing'
+            sharing.validateTarget
+            sharing.replicate
+        ]
+


fix formatting of non model

fix formatting of non model

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


added unit test (work in progress)

added unit test (work in progress)

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

--- test/unit/coffee/Compression.coffee
+++ test/unit/coffee/Compression.coffee
@@ -0,0 +1,100 @@
+sinon = require('sinon')
+chai = require('chai')
+should = chai.should()
+modulePath = "../../../app/js/RedisManager"
+SandboxedModule = require('sandboxed-module')
+
+describe "RedisManager.setDocument and getDocument", ->
+	beforeEach ->
+		@zip_opts =
+			writesEnabled: true
+			minSize: 1000
+		@doc_id = "document-id"
+		@version = 123
+		@RedisManager = SandboxedModule.require modulePath, requires:
+			"settings-sharelatex" :
+				redis:
+					web:
+						host: 'none'
+						port: 'none'
+					zip: @zip_opts
+			"redis-sharelatex" : createClient: () =>
+				@rclient ?=
+					auth:-> # only assign one rclient
+					multi: () => @rclient
+					set: (key, value) => @rclient.store[key] = value
+					get: (key) => @rclient.results.push @rclient.store[key]
+					incr: (key) => @rclient.store[key]++
+					exec: (callback) =>
+						callback.apply(null, [null, @rclient.results])
+						@rclient.results = []
+					store: {}
+					results: []
+			"logger-sharelatex": {}
+
+		@RedisManager.setDocument(@doc_id, @docLines, @version, @callback)
+
+	describe "for a small document (uncompressed)", ->
+		before ->
+			@docLines = ["hello", "world"]
+			@callback = sinon.stub()
+
+		it "should set the document", ->
+			@rclient.store['doclines:document-id']
+				.should.equal JSON.stringify(@docLines)
+
+		it "should return the callback", ->
+			@callback.called.should.equal true
+
+		it "should get the document back again", (done) ->
+			@RedisManager.getDoc @doc_id, (err, lines, version) =>
+				@docLines.should.eql lines
+				done()
+
+	describe "for a large document (with compression enabled)", ->
+		before ->
+			@zip_opts =
+				writesEnabled: true
+				minSize: 1000
+			@docLines = []
+			while @docLines.join('').length <= @zip_opts.minSize
+				@docLines.push "this is a long line in a long document"
+			@callback = sinon.stub()
+
+		it "should set the document as a gzipped blob", ->
+			@rclient.store['doclines:document-id']
+				.should.not.equal JSON.stringify(@docLines)
+
+		it "should return the callback", ->
+			@callback.called.should.equal true
+
+		it "should get the uncompressed document back again", (done) ->
+			@RedisManager.getDoc @doc_id, (err, lines, version) =>
+				@docLines.should.eql lines
+				done()
+
+	describe "for a large document (with compression disabled)", ->
+		before ->
+			@zip_opts =
+				writesEnabled: false
+				minSize: 1000
+			@docLines = []
+			while @docLines.join('').length <= @zip_opts.minSize
+				@docLines.push "this is a long line in a long document"
+			@callback = sinon.stub()
+
+		it "should set the document", ->
+			@rclient.store['doclines:document-id']
+				.should.equal JSON.stringify(@docLines)
+
+		it "should return the callback", ->
+			@callback.called.should.equal true
+
+		it "should get the document back again", (done) ->
+			@RedisManager.getDoc @doc_id, (err, lines, version) =>
+				@docLines.should.eql lines
+				done()
+
+
+
+


Adding language Riot.js

Adding language Riot.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/dvingo/atom-beautify.git/'


some work on arrows

some work on arrows

--- app/lib/surface/CocoSprite.coffee
+++ app/lib/surface/CocoSprite.coffee
@@ -255,9 +255,7 @@
     if @thangType.get('name') is 'Arrow'
       # scale the arrow so it appears longer when flying parallel to horizon
       angle = @getRotation()
-      angle = -angle if angle < 0
-      angle = 180 - angle if angle > 90
-      scaleX = 0.5 + 0.5 * (90 - angle) / 90
+      scaleX = 0.5 + 0.5 * angleDiffFactorFrom90(angle)
     scaleFactorX = @thang.scaleFactorX ? @scaleFactor
     scaleFactorY = @thang.scaleFactorY ? @scaleFactor
     @imageObject.scaleX = @originalScaleX * scaleX * scaleFactorX
@@ -275,10 +273,29 @@
     if @options.showInvisible
       @imageObject.alpha = Math.max 0.5, @imageObject.alpha

+  angleDiffFactorFrom90: (angle) ->
+    # how much horizontal is angle, which must be (-180, 180].
+    # 1 for parallel to horizon, 0 for orthogonal, monotonuous in between
+    angle = -angle if angle < 0
+    angle = 180 - angle if angle > 90
+    return (90 - angle) / 90
+
   updateRotation: (imageObject) ->
     rotationType = @thangType.get('rotationType')
     return if rotationType is 'fixed'
     rotation = @getRotation()
+    if False and @thangType.get('name') is 'Arrow'
+      # Makes arrow rotate properly when travelling upwards or downwards with z-coordinate.
+      # If it's travelling parallel to horizon, then the arc must be more visible.
+      # But when it's perpendicular, the arrow must be scaled, not rotated, to pretend
+      # it is getting closer to the camera.
+      velocity = @thang.velocity.z
+      originallyHeaded = 360 - @thang.initialRotation / Math.PI * 180
+      originallyHeaded -= 360 if originallyHeaded > 180
+      angleFactor = angleDiffFactorFrom90(originallyHeaded) # the more it is, the more deviation from original direction
+      speedLimit = 7 # for normalization purposes
+      velocityFactor = velocity / speedLimit # same as angleFactor
+      rotation = originallyHeaded + velocityFactor * angleFactor * 45
     imageObject ?= @imageObject
     return imageObject.rotation = rotation if not rotationType
     @updateIsometricRotation(rotation, imageObject)


Mock sd in tests

Mock sd in tests

--- src/desktop/apps/auth/test/routes.coffee
+++ src/desktop/apps/auth/test/routes.coffee
@@ -17,7 +17,11 @@
       get: sinon.stub()
       logout: sinon.stub()
       user: new Backbone.Model accessToken: 'secret'
-    @res = render: sinon.stub(), send: sinon.stub(), redirect: sinon.stub()
+    @res =
+      locals: sd: {}
+      redirect: sinon.stub()
+      render: sinon.stub()
+      send: sinon.stub()
     @next = sinon.stub()

   describe '#resetPassword', ->


Fix tests for Homepage Search lab

Fix tests for Homepage Search lab

--- src/desktop/apps/home/test/routes.coffee
+++ src/desktop/apps/home/test/routes.coffee
@@ -34,6 +34,10 @@
       redirect: sinon.stub()
       cookie: @cookieStub = sinon.stub()

+    @user = {
+      hasLabFeature: () -> false
+    }
+
   afterEach ->
     Backbone.sync.restore()

@@ -47,7 +51,7 @@
         Backbone.sync
           .onCall 0
           .yieldsTo 'error'
-        routes.index extend({ user: 'existy' }, @req), @res
+        routes.index extend(@user, @req), @res
           .then =>
             @res.render.args[0][0].should.equal 'index'
             @res.render.args[0][1].featuredLinks.length.should.equal 0
@@ -87,6 +91,9 @@
                 .should.equal 'Sign up to get updates on your favorite artists'

     describe 'logged in', ->
+      beforeEach ->
+        @req.user = @user
+
       it 'renders the homepage without the welcome hero unit', ->
         @metaphysics.returns Promise.resolve
           home_page:
@@ -95,7 +102,7 @@
         Backbone.sync
             .onCall 0
             .yieldsTo 'success', [fabricate 'featured_link']
-        routes.index extend({ user: 'existy' }, @req), @res
+        routes.index @req, @res
           .then =>
             @res.render.args[0][0].should.equal 'index'
             @res.render.args[0][1].modules[0].key.should.equal 'followed_artists'
@@ -103,10 +110,11 @@
               .should.equal 'My hero'

       it 'with lab feature, does not fetch hero units or featured links', ->
+        @user.hasLabFeature = () -> true
         @metaphysics.returns Promise.resolve
           home_page:
             artwork_modules: []
-        routes.index extend({ user: { lab_features: ['Homepage Search'] } }, @req), @res
+        routes.index @req, @res
           .then =>
             @res.render.args[0][0].should.equal 'index'
             @res.render.args[0][1].modules[0].key.should.equal 'followed_artists'
@@ -118,7 +126,7 @@
         Backbone.sync
             .onCall 0
             .yieldsTo 'success', [fabricate 'featured_link']
-        routes.index extend({ user: 'existy' }, @req), @res
+        routes.index @req, @res
           .then =>
             @res.render.args[0][0].should.equal 'index'
             @res.render.args[0][1].modules[0].key.should.equal 'followed_artists'


Fix hotkeys in peer and staff grading to use ctrl prefix

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


Fix missing devMode param in AtomApplication#findPackageWithName

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


Tests: Add failing test getting non-existant attribute in continue tree

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

--- spec/Subtree.coffee
+++ spec/Subtree.coffee
@@ -0,0 +1,47 @@
+chai = require 'chai' unless chai
+Choice = require '../lib/Choice'
+Root = require '../lib/Root'
+
+describe 'Subtrees', ->
+
+  describe 'non-existent attribute lookup in tree', ->
+    it 'should return null', (done) ->
+
+      direct = (orig, data) ->
+        subtree = orig.tree 'directcalc'
+        subtree.deliver data
+        t = subtree.then 'tripled', (c, d) ->
+          chai.expect(c.get('non-existant1')).to.equal null
+          d * 3
+
+      t = Root()
+      t.deliver 5
+      .all [direct]
+      .finally (c, res) ->
+        chai.expect(c.get('non-existant2')).to.equal null
+        chai.expect(res).to.be.an 'array'
+        chai.expect(res).to.eql [
+          15
+        ]
+        done()
+
+
+  describe 'non-existant attribute lookup in continue tree', ->
+    it 'should return null', (done) ->
+      direct = (orig, data) ->
+        subtree = orig.continue 'directcalc'
+        subtree.deliver data
+        t = subtree.then 'tripled', (c, d) ->
+          chai.expect(c.get('non-existant1')).to.equal null
+          d * 3
+
+      t = Root()
+      t.deliver 5
+      .all [direct]
+      .finally (c, res) ->
+        chai.expect(c.get('non-existant2')).to.equal null
+        chai.expect(res).to.be.an 'array'
+        chai.expect(res).to.eql [
+          15
+        ]
+        done()


Add limit to returned models from OneProvider#get().

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


fix some rendering bugs and prepare for integration!

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


fix the syntax of the length exceeding line

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


Return item after update

Return item after update

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


private message component

private message component

error: pathspec 'app/pages/profile/private-message.cjsx' did not match any file(s) known to git

--- app/pages/profile/private-message.cjsx
+++ app/pages/profile/private-message.cjsx
@@ -0,0 +1,29 @@
+counterpart = require 'counterpart'
+React = require 'react'
+PrivateMessageForm = require '../../talk/private-message-form'
+PromiseRenderer = require '../../components/promise-renderer'
+authClient = require '../../api/auth'
+{Navigation} = require 'react-router'
+
+
+module.exports = React.createClass
+  displayName: 'PrivateMessagePage'
+  mixins: [Navigation]
+
+  render: ->
+    <PromiseRenderer promise={authClient.checkCurrent()} pending={null}>{(user) =>
+      if user?
+        if user?.login isnt @props.params?.name
+          <PrivateMessageForm {...@props} />
+        else
+          @redirectToMessages()
+      else
+        @redirectToCollections()
+    }</PromiseRenderer>
+
+  redirectToMessages: ->
+    @transitionTo 'inbox'
+
+  redirectToCollections: ->
+    @transitionTo 'collections-user', owner: @props.params?.name
+


add support for 140 css colors

add support for 140 css colors

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


[driver] add --mini to the help message

[driver] add --mini to the help message

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


removed loginhandlerhelper class

removed loginhandlerhelper class

--- servers/testhelper/index.coffee
+++ servers/testhelper/index.coffee
@@ -266,40 +266,6 @@
     return requestParams

-class LoginHandlerHelper
-
-  @generateLoginRequestBody = (opts = {}) ->
-
-    defaultBodyObject =
-      token               : ''
-      tfcode              : ''
-      username            : generateRandomUsername()
-      password            : 'testpass'
-      redirect            : ''
-      groupName           : 'koding'
-
-    deepObjectExtend defaultBodyObject, opts
-
-    return defaultBodyObject
-
-
-  # overwrites given options in the default params
-  @generateLoginRequestParams = (opts = {}) ->
-
-    url  = generateUrl
-      route : 'Login'
-
-    body = LoginHandlerHelper.generateLoginRequestBody()
-
-    params                = { url, body }
-    defaultRequestParams  = generateDefaultRequestParams params
-    requestParams         = deepObjectExtend defaultRequestParams, opts
-    # after deep extending object, encodes body param to a query string
-    requestParams.body    = querystring.stringify requestParams.body
-
-    return requestParams
-
-
 module.exports = {
   generateUrl
   deepObjectExtend
@@ -309,5 +275,4 @@
   generateDefaultRequestParams

   TeamHandlerHelper
-  LoginHandlerHelper
 }


login app : if login made via invitation , show notification on tray.

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


Add darwin menu

Add darwin menu

error: pathspec 'menus/darwin.cson' did not match any file(s) known to git

--- menus/darwin.cson
+++ menus/darwin.cson
@@ -0,0 +1,15 @@
+'menu': [
+  {
+    label: '&Zenit'
+    submenu: [
+      { label: 'E&xit', command: 'application:quit' }
+    ]
+  }
+
+  {
+    label: '&Developer'
+    submenu: [
+      { label: 'Toggle Developer &Tools', command: 'window:toggle-dev-tools' }
+    ]
+  }
+]


Add check to make sure that a cwiki space does exist

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/apache/infrastructure-puppet.git/'


Hacker News

Hacker News

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

--- src/scripts/hackernews.coffee
+++ src/scripts/hackernews.coffee
@@ -0,0 +1,50 @@
+# Hacker News
+#
+# hn top <N> - get the top N items on hacker news (or your favorite RSS feed)
+# hn.top - refer to the top item on hn
+# hn[i] - refer to the ith item on hn
+NodePie = require("nodepie")
+
+hnFeedUrl = "https://news.ycombinator.com/rss"
+
+module.exports = (robot) ->
+  robot.respond /HN top (\d+)?/i, (msg) ->
+    msg.http(hnFeedUrl).get() (err, res, body) ->
+      if res.statusCode is not 200
+        msg.send "Something's gone awry"
+      else
+        feed = new NodePie(body)
+        try
+          feed.init()
+          count = msg.match[1] || 5
+          items = feed.getItems(0, count)
+          msg.send item.getTitle() + ": " + item.getPermalink() + " (" + item.getComments()?.html + ")" for item in items
+        catch e
+          console.log(e)
+          msg.send "Something's gone awry"
+
+  robot.hear /HN(\.top|\[\d+\])/i, (msg) ->
+     msg.http(hnFeedUrl).get() (err, res, body) ->
+       if res.statusCode is not 200
+         msg.send "Something's gone awry"
+       else
+         feed = new NodePie(body)
+         try
+           feed.init()
+         catch e
+           console.log(e)
+           msg.send "Something's gone awry"
+         element = msg.match[1]
+         if element == "HN.top"
+           idx = 0
+         else
+           idx = (Number) msg.match[0].replace(/[^0-9]/g, '')
+         try
+           item = feed.getItems()[idx]
+           msg.send item.getTitle() + ": " + item.getPermalink() + " (" + item.getComments()?.html + ")"
+         catch e
+           console.log(e)
+           msg.send "Something's gone awry"
+
+
+


Rewrite I18nController

Rewrite I18nController

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

--- client/app/i18n/i18n.controller.coffee
+++ client/app/i18n/i18n.controller.coffee
@@ -0,0 +1,219 @@
+'use strict'
+
+angular.module('arethusaTranslateGuiApp').controller 'I18nCtrl', [
+  '$scope',
+  '$resource',
+  '$modal',
+  'CONFIG',
+  ($scope, $resource, $modal, CONFIG) ->
+    $scope.showIndex = true
+    $scope.maxItemsShown = 0
+    $scope.languages = CONFIG.languages
+
+    # We cannot store stats directly with resources, as we don't
+    # store them in the DB. We therefore populate a dedicated
+    # stats store ourselves.
+    $scope.stats = {}
+
+    Container = $resource '/api/containers/:id', { id: '@_id' },
+      update:
+        method: 'PUT'
+
+    Uid = $resource('/api/uid')
+
+    class LangStats
+      constructor: ->
+        for lang in $scope.languages
+          @[lang] = 0
+
+    class Stats
+      constructor: ->
+        @total = 0
+        @dirty = 0
+        @lang = new LangStats()
+
+    addValStats = (dirty, elements) ->
+      for el in elements
+        el.total += 1
+        el.dirty += 1 if dirty
+
+    addTrslStats = (lang, dirty, elements) ->
+      if dirty
+        for el in elements
+          el.lang[lang] += 1
+
+    addMissingTranslations = (trsls) ->
+      langs = $scope.languages
+      if langs.length isnt trsls.length
+        missing = angular.copy(langs)
+        for trsl in trsls
+          i = missing.indexOf(trsl.lang)
+          missing.splice(i, 1)
+        for missingLang in missing
+          trsls.push(new Translation(missingLang))
+
+    parseTranslations = (translations, elements) ->
+      addMissingTranslations(translations)
+      for trsl in translations
+        addTrslStats(trsl.lang, trsl.dirt, elements)
+
+    parseValues = (values, elements) ->
+      for val in values
+        addValStats(val.dirty, elements)
+        parseTranslations(val.translations, elements)
+
+    addToStatsStore = (el) ->
+      stats = new Stats()
+      $scope.stats[el._id] = stats
+
+    $scope.substractFromTotal = (parent, stats) ->
+      parent.total -= stats.total
+      parent.dirty -= stats.dirty
+      [parLang, sttLang] = [parent.lang, stats.lang]
+      for lang in parLang
+        parLang[lang] -= sttLang[lang]
+
+    parseContainers = (containers, elements) ->
+      for container in containers
+        stats = addToStatsStore(container)
+        elements.push(stats)
+        parseValues(container.values, elements)
+        parseContainers(container.containers, elements)
+        elements.pop()
+
+    parseData = (containers) ->
+      total = new Stats()
+      elements = [total]
+      parseContainers(containers, elements)
+      total
+
+    setup = (containers) -> $scope.stats.total = parseData(containers)
+
+    $scope.getStats = (el) -> $scope.stats[el._id] || {}
+
+    updateStats = (stats, value, count) ->
+      stats.total += count
+      if value.dirty
+        stats.dirty += count
+        for trsl in value.translations
+          stats.lang[trsl.lang] += count if trsl.dirty
+
+    $scope.addStats    = (stats, value) -> updateStats(stats, value, 1)
+    $scope.removeStats = (stats, value) -> updateStats(stats, value, -1)
+
+    $scope.updateValStats = (stats, trsl) ->
+      counter = if trsl.dirty then 1 else -1
+      stats.dirty += counter
+
+    $scope.updateTrslStats = (stats, trsl) ->
+      counter = if trsl.dirty then 1 else -1
+      stats.lang[trsl.lang] += counter
+
+    defaultContainerParams = ->
+      dirty: true
+      createdAt: new Date().toJSON
+
+    $scope.newContainer = (params) ->
+      params = angular.extend(defaultContainerParams, params)
+      new Container(params)
+
+    $scope.adminMode = false
+    $scope.$watch 'adminMode', (newVal) ->
+      $scope.modeText = if newVal then 'Admin Mode' else 'Translator Mode'
+
+    $scope.toggleMode = -> $scope.adminMode = !$scope.adminMode
+
+    $scope.addContainer = ->
+      cont = $scope.newContainer()
+      cont.$save ->
+        addToStatsStore(cont)
+        $scope.autoFocus = true
+        $scope.containers.unshift(cont)
+
+    $scope.subContainerFactory = (childScope) ->
+      ->
+        Uid.get (res) ->
+          subContainer = $scope.newContainer
+            _id: res.uid
+            values: []
+            containers: []
+        addToStatsStore(subContainer)
+        childScope.container.containers.unshift(subContainer)
+        childScope.immediateUpdate()
+        childScope.$emit('subContainerChange')
+        $scope.autoFocus = true
+
+    $scope.$on 'autoFocusTriggered', -> $scope.autoFocus = false
+
+    class Value
+      constructor: (trsls, id) ->
+        @_id = id
+        @dirty = true
+        @translations = trsls
+        @createdAt = new Date().toJSON()
+
+    class Translation
+      constructor: (lang) ->
+        @lang = lang
+        @dirty = CONFIG.main isnt lang
+
+    $scope.newTranslation = (lang) -> new Translation(lang)
+
+    $scope.valueFactory = (childScope) ->
+      ->
+        Uid.get (res) ->
+          cont = childScope.container
+          trsls = (new Translation(lang) for lang in $scope.languages)
+          value = new Value(trsls, res.uid)
+
+          cont.values.unshift(value)
+          cont.dirty = true
+          $scope.autoFocus = true
+          childScope.$emit('valueAdded', value)
+          childScope.immediateUpdate()
+
+
+    modalArgs =
+      templateUrl: 'app/i18n/removal_dialog.html'
+      windowClass: 'removal-modal'
+
+    removalConfirmed = ->
+      $modal.open(modalArgs).result
+
+    $scope.removeHelper = (containers, container, fn) ->
+      if result
+        i = container.indexOf(container)
+        containers.splice(i, 1)
+        fn()
+
+    $scope.infiniteScroll = -> $scope.maxItemsShown += 5
+    $scope.resetMaxItems = -> scope.maxItemsShown = 4 if $scope.maxItemsShows > 5
+
+    removeFromStatsStore = (ev, el) ->
+      stats = $scope.stats[el._id]
+      delete $scope.stats[el._id]
+      $scope.substractFromTotal($scope.stats.total, stats)
+
+    updateVal = (ev, val) -> $scope.updateValStats($scope.stats.total, val)
+    updateTrsl = (ev, el) -> $scope.updateTrslStats($scope.stats.total, el)
+
+    addToStats = (ev, el) -> $scope.addStats($scope.stats.total, el)
+    removeFromStats = (ev, el) -> $scope.removeStats($scope.stats.total, el)
+
+    $scope.$on('containerRemoved', removeFromStatsStore)
+    $scope.$on('valueChange', updateVal)
+    $scope.$on('trslChange', updateTrsl)
+    $scope.$on('valueAdded', addToStats)
+    $scope.$on('valueRemoved', removeFromStats)
+
+    $scope.scrollWatch = (scope, ownId, element) ->
+      scope.$on 'autoScrollRequest', (ev, id) ->
+        scope.$emit('scrollToItem', element) if id is ownId
+
+    Container.query (res) ->
+      $scope.containers = res
+      $scope.maxItemsShown = $scope.containers.length if $scope.showIndex
+      setup(res)
+      $scope.$broadcast('dataLoaded')
+]
+


unassigned invites script

unassigned invites script

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

--- scripts/unaccepted-invites.coffee
+++ scripts/unaccepted-invites.coffee
@@ -0,0 +1,15 @@
+require 'colors'
+env = require '../config/env'
+mongoose = require('../models')(env.mongo_url)
+
+Team = mongoose.model 'Team'
+
+console.log "team_id\tteam\temail\tcode"
+
+Team.find {"peopleIds": []}, (err, teams) ->
+  throw err if err
+  i = teams.length
+  teams.forEach (team) ->
+    team.invites.forEach (invite) ->
+      console.log "#{team.id}\t#{team.name ? ""}\t#{invite.email.replace(/\.nodeknockout\.com$/, '')}\t#{invite.code}"
+    mongoose.connection.close() if --i is 0


View for managing masonry artwork saves

View for managing masonry artwork saves

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

--- components/artwork_masonry/view.coffee
+++ components/artwork_masonry/view.coffee
@@ -0,0 +1,37 @@
+Backbone = require 'backbone'
+{ invoke } = require 'underscore'
+User = require '../../models/user.coffee'
+masonry = require './index.coffee'
+ArtworkSaveView = require '../artwork_save/view.coffee'
+template = -> require('./index.jade') arguments...
+
+module.exports = class ArtworkMasonryView extends Backbone.View
+  subViews: []
+
+  initialize: ({ @artworks }) ->
+    @user = User.instantiate()
+    { @savedArtworks } = @user.related()
+
+  postRender: ->
+    @subViews = @artworks.map ({ id }) =>
+      view = new ArtworkSaveView id: id, user: @user
+      @$(".js-artwork-brick-save-controls[data-id='#{id}']")
+        .html view.render().$el
+      view
+
+    @user.related().savedArtworks
+      .check @artworks.map ({ id }) -> id
+
+  reset: (artworks) ->
+    invoke @subViews, 'remove'
+    @artworks = artworks
+    this
+
+  render: ->
+    @$el.html template
+      columns: masonry @artworks
+    @postRender()
+    this
+
+  remove: ->
+    invoke @subViews, 'remove'


Revert "Fixed minor typo in task configuration"

This reverts commit b922877a45c02b404a4d7242c4eea101b5bd7318.

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


Sort not required

Sort not required

--- SingularityUI/app/collections/LogLines.coffee
+++ SingularityUI/app/collections/LogLines.coffee
@@ -63,7 +63,6 @@
         request = super _.extend params, defaultParams

         request.done ({data}) =>
-            @sort()
             @moreToFetch = data.length is @requestLength

         request


Use config build dir for clean

Use config build dir for clean

--- Gruntfile.coffee
+++ Gruntfile.coffee
@@ -62,7 +62,7 @@
       css: "<%= dirs.build %>/themes/css"

     clean:
-      build: ["stage"]
+      build: ["<%= dirs.build %>"]
       dist: ["<%= dirs.dist %>"]

     copy:


Batches insertion of thangs to treema to speed up terrain generation

--- app/views/editor/level/thangs_tab_view.coffee
+++ app/views/editor/level/thangs_tab_view.coffee
@@ -225,9 +225,11 @@
     @editThang thangID: e.thang.id

   onRandomiseTerrain: (e) ->
+    @thangsBatch = []
     for thang in e.thangs
       @selectAddThangType thang.id
-      @addThang @addThangType, thang.pos
+      @addThang @addThangType, thang.pos, true
+    @batchInsert()
     @selectAddThangType null

   # TODO: figure out a good way to have all Surface clicks and Treema clicks just proxy in one direction, so we can maintain only one way of handling selection and deletion
@@ -397,7 +399,11 @@
     id = treema?.data?.id
     @editThang thangID: id if id

-  addThang: (thangType, pos) ->
+  batchInsert: ->
+    @thangsTreema.set '', @thangsBatch
+    @thangsBatch = []
+
+  addThang: (thangType, pos, batchInsert = false) ->
     thangID = Thang.nextID(thangType.get('name'), @world) until thangID and not @thangsTreema.get "id=#{thangID}"
     if @cloneSourceThang
       components = _.cloneDeep @thangsTreema.get "id=#{@cloneSourceThang.id}/components"
@@ -408,7 +414,10 @@
     physical = _.find components, (c) -> c.config?.pos?
     physical.config.pos = x: pos.x, y: pos.y, z: physical.config.pos.z if physical
     thang = thangType: thangType.get('original'), id: thangID, components: components
-    @thangsTreema.insert '', thang
+    if batchInsert
+      @thangsBatch.push thang
+    else
+      @thangsTreema.insert '', thang

   editThang: (e) ->
     if e.target  # click event


Fixes bug with placing addThang after randomise

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

   # TODO: figure out a good way to have all Surface clicks and Treema clicks just proxy in one direction, so we can maintain only one way of handling selection and deletion
   onExtantThangSelected: (e) ->


new openvz api

new openvz api


Fix rookie mistake in base.js with the new authenticator calling the old one as well.

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


Set to quite mode while the participant is resurrecting snapshot from local

--- client/ide/lib/collaborationcontroller.coffee
+++ client/ide/lib/collaborationcontroller.coffee
@@ -596,7 +596,7 @@
         @layoutManager.resurrectSnapshot @getHostSnapshotForParticipant(), yes
       else
         @fetchSnapshot (snapshot) =>
-          @layoutManager.resurrectSnapshot snapshot  if snapshot
+          @layoutManager.resurrectSnapshot snapshot, yes  if snapshot

   getHostSnapshotKey: ->


Create a logger specifically for keeping track of the path a user takes through the inquiry flow

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

--- components/inquiry_questionnaire/trail.coffee
+++ components/inquiry_questionnaire/trail.coffee
@@ -0,0 +1,12 @@
+module.exports = class Trail
+  constructor: ->
+    @reset()
+
+  reset: ->
+    @breadcrumbs = []
+
+  log: (breadcrumb) ->
+    @breadcrumbs.push breadcrumb
+
+  toString: ->
+    @breadcrumbs.join ','


Removed some vestigial wizard coloring code from the settings account view.

--- app/views/account/settings_view.coffee
+++ app/views/account/settings_view.coffee
@@ -13,7 +13,6 @@
   events:
     'click #save-button': 'save'
     'change #settings-panes input': 'save'
-    'change input[type="range"]': 'updateWizardColor'
     'click #toggle-all-button': 'toggleEmailSubscriptions'

   constructor: (options) ->
@@ -46,7 +45,6 @@
     )

     @chooseTab(location.hash.replace('#',''))
-    @updateWizardColor()
     WizardSettingsView = new WizardSettingsView()
     WizardSettingsView.on 'change', @save, @
     @insertSubView WizardSettingsView
@@ -71,15 +69,6 @@
     c.subs[sub] = 1 for sub in c.me.get('emailSubscriptions') or ['announcement', 'tester', 'level_creator', 'developer']
     c

-  getWizardColor: ->
-    parseInt($('#wizard-color-1', @$el).val()) / 100
-
-  updateWizardColor: =>
-    rgb = hslToRgb(@getWizardColor(), 1.0, 0.6)
-    rgb = (parseInt(val) for val in rgb)
-    newColor = "rgb(#{rgb[0]},#{rgb[1]},#{rgb[2]})"
-    $('.range-color', @$el).css('background-color', newColor)
-
   getSubscriptions: ->
     inputs = $('#email-pane input[type="checkbox"]', @$el)
     inputs = ($(i) for i in inputs)
@@ -99,6 +88,8 @@
     if res?
       forms.applyErrorsToForm(@$el, res)
       return
+
+    return unless me.hasLocalChanges()

     res = me.save()
     return unless res
@@ -131,7 +122,6 @@
   grabOtherData: ->
     me.set('name', $('#name', @$el).val())
     me.set('email', $('#email', @$el).val())
-    me.set('wizardColor1', @getWizardColor())
     me.set('emailSubscriptions', @getSubscriptions())

     adminCheckbox = @$el.find('#admin')


fix(build): fix modal dialog paths(appVersion url)

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


Disable throttling in test windows via WebAudio hack

Throttling in test windows is annoying when tests run interactively,
and *seems* to cause issues with animation frames not firing even in
headless tests, though it’s difficult to fully confirm since this issue
is intermittent.

--- src/initialize-test-window.coffee
+++ src/initialize-test-window.coffee
@@ -57,6 +57,12 @@

     document.title = "Spec Suite"

+    # Avoid throttling of test window by playing silence
+    context = new AudioContext()
+    source = context.createBufferSource()
+    source.connect(context.destination)
+    source.start(0)
+
     testRunner = require(testRunnerPath)
     legacyTestRunner = require(legacyTestRunnerPath)
     buildDefaultApplicationDelegate = -> new ApplicationDelegate()


typos

typos

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/gdhack-gpd-ui.git/'


Notification: Add glance wrapper to socialapicontroller


Fix recovery and invitation work flows

Fix recovery and invitation work flows


[UPDATE] add jsdoc file

[UPDATE] add jsdoc file

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/Planeshifter/my-atomic-snippets.git/'


stream-based logger

stream-based logger

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


Kite: create kite helper for koding client related operations


add support for web strings when creating colors


Use working directory instead of project path

Project path might be a sub directory of the repository

--- lib/git-status-view.coffee
+++ lib/git-status-view.coffee
@@ -19,8 +19,9 @@

   populate: ->
     paths = []
+    workingDirectory = atom.project.getRepo().getWorkingDirectory()
     for filePath, status of atom.project.getRepo().statuses
-      filePath = path.join(atom.project.getPath(), filePath)
+      filePath = path.join(workingDirectory, filePath)
       paths.push(filePath) if fs.isFileSync(filePath)

     @setItems(paths)


Fixup outcomes report

Fixup outcomes report

* Course progress: count students only from selected classrooms
* Programs written: count only sessions in selected classrooms/courses

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


Fix startDate not being editable

Fix startDate not being editable

--- app/views/admin/OutcomesReportView.coffee
+++ app/views/admin/OutcomesReportView.coffee
@@ -46,13 +46,12 @@
     dataReady: false
     isClassroomSelected: {}
     isCourseSelected: {}
+    startDate: null
     endDate: moment(new Date()).format('MMM D, YYYY')
     earliestSessionDate: new Date()
     earliestClassroomDate: new Date()
     insightsMarkdown: ""
   computed:
-    startDate: ->
-      moment(_.max([@earliestSessionDate, @earliestClassroomDate])).format('MMM D, YYYY')
     sessions: ->
       _.flatten(@classrooms.map (c) -> c.sessions)
     selectedSessions: ->
@@ -260,7 +259,8 @@
               @courses = utils.sortCourses(courseIDs.map (courseID) =>
                 indexedCourses[courseID]
               )
-          ])
+          ]).then (trialRequests, classrooms) =>
+            @startDate = moment(_.max([@earliestSessionDate, @earliestClassroomDate])).format('MMM D, YYYY')

     fetchCompleteUser: (data) ->
       new Promise (accept, reject) ->


Comprehensive event date formatting module.

Handles three different detail levels for different UI contexts,
three languages, multi-day events and event time displaying
peculiarities.

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

--- src/dateformat.coffee
+++ src/dateformat.coffee
@@ -0,0 +1,147 @@
+
+moment = require 'moment'
+
+# Test moments
+a = moment('2014-07-15T12:00:00')
+b = moment('2014-07-15T14:00:00')
+c = moment('2014-07-16T10:00:00')
+d = moment('2014-07-15T23:59:59')
+e = moment('2014-07-16T00:00:00')
+f = moment('2015-07-16T00:00:00')
+g = moment('2014-08-15T00:00:00')
+h = moment()
+i = moment().add 2, 'hours'
+j = moment().add 2, 'days'
+k = moment().add 1, 'year'
+
+is_multi_day_event = ([start, end]) ->
+    end? and not start.isSame end, 'day'
+is_multi_year_event = ([start, end]) ->
+    end? and not start.isSame end, 'year'
+is_multi_month_event = ([start, end]) ->
+    end? and not start.isSame end, 'month'
+
+locale = 'fi'
+get_language = ->
+    locale
+
+clock_word =
+    'fi': 'klo',
+    'sv': 'kl.',
+    'en-gb': 'at'
+
+date_format = (specs, include_month=true) ->
+    format = []
+    add = (x) -> format.push x
+    if specs.include_weekday
+        add specs.format.weekday
+    if true
+        add specs.format.day_of_month
+    if include_month
+        add specs.format.month
+    if specs.include_year
+        add specs.format.year
+    format
+
+humanize = (m) ->
+    day = m.calendar()
+    # todo: Swedish
+    day = day.replace /( (klo|at))* \d{1,2}[:.]\d{1,2}$/, ''
+    day
+
+format_event_datetime = (start, end, specs) ->
+    results = {}
+    start.locale locale
+    end.locale locale
+    format = date_format specs,
+        include_month = specs.include_start_time or specs.include_first_month
+    if specs.humanize
+        date = humanize start
+    else
+        date = start.format format.join(' ')
+
+    start_time = start.format specs.format.time
+    end_time = end.format specs.format.time
+    if is_multi_day_event [start, end]
+        format = date_format specs
+        if not specs.include_year and specs.include_start_time
+            date += ' ' + start_time
+        date += '—' + end.format format.join(' ')
+        if not specs.include_year and specs.include_end_time
+            date += ' ' + end_time
+    else
+        if specs.include_start_time
+            results.start_time = start_time
+        if specs.include_end_time
+            results.end_time = end_time
+    if specs.humanize_notice
+        results.notice = humanize start
+
+    if results.start_time
+        results.time = "#{clock_word[get_language()]} #{results.start_time}"
+        delete results.start_time
+    if results.end_time
+        results.time += " #{results.end_time}"
+        delete results.end_time
+    results.date = date
+    results
+
+format_specs = (language, space) ->
+    weekday =
+        if space == 'large'
+            'dddd'
+        else
+            'dd'
+    month =
+        if space == 'large'
+            if get_language() == 'fi' then 'MMMM[ta]'
+            else 'MMMM'
+        else
+            if get_language() == 'fi' then 'Mo'
+            else 'M'
+    day_of_month =
+        if get_language() == 'fi' then 'Do'
+        else 'D'
+
+    time: 'LT'
+    year: 'YYYY'
+    weekday: weekday
+    month: month
+    day_of_month: day_of_month
+
+humanize_event_datetime = (start, end, space, has_end_time=false) ->
+    ev = [start, end]
+    now = moment()
+    specs = {}
+    specs.include_year =
+        is_multi_year_event ev
+    specs.include_first_month =
+        is_multi_month_event ev
+    if space == 'large' and is_multi_day_event ev
+        specs.include_weekday = true
+
+    specs.include_start_time =
+        space == 'large' or not is_multi_day_event ev
+    specs.include_end_time =
+        has_end_time and space == 'large'
+
+    unless is_multi_day_event ev
+        specs.include_first_month = true
+        sod = now.startOf 'day'
+        diff = start.diff sod, 'days', true
+        _humanize = diff > -7 and diff <= 7
+        if space == 'large'
+            specs.humanize_notice = _humanize
+        else
+            specs.humanize = _humanize
+        if specs.humanize
+            if space == 'small'
+                specs.include_start_time = false
+            else
+                specs.include_start_time = true
+        else
+            specs.include_weekday = true
+
+    specs.format = format_specs get_language(), space
+    result = format_event_datetime start, end, specs
+    result


More keymap refinements

More keymap refinements

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


renaming new data field in rename categories post and refactoring

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


Added Lua-Snippets

Added Lua-Snippets

error: pathspec 'snippets/language-glua.cson' did not match any file(s) known to git

--- snippets/language-glua.cson
+++ snippets/language-glua.cson
@@ -0,0 +1,55 @@
+'.source.lua':
+  'multiline comment':
+    'prefix': '-['
+    'body': '--[[ ${0:comment...}]'
+  'nested multiline comment':
+    'prefix': '=['
+    'body': '--[=[ ${0:comment...}]='
+  'function':
+    'prefix': 'fun'
+    'body': 'function ${1:FunctionName} (${2:args})\n\t${0:-- body...}\nend'
+  'anon function':
+    'prefix': 'afun'
+    'body': '${1:FunctionName} = function (${2:args})\n\t${0:-- body...}\nend'
+  'while loop':
+    'prefix': 'while'
+    'body': 'while ${1:condition} do\n\t${0:-- body...}\nend'
+  'while loop shortcut':
+    'prefix': 'whi'
+    'body': 'while ${1:condition} do\n\t${0:-- body...}\nend'
+  'repeat loop':
+    'prefix': 'repeat'
+    'body': 'repeat\n\t${0:-- body...}\nuntil ${1:condition}'
+  'repeat loop shortcut':
+    'prefix': 'rep'
+    'body': 'repeat\n\t${0:-- body...}\nuntil ${1:condition}'
+  'for i,v in ipairs()':
+    'prefix': 'fori'
+    'body': 'for ${1:i},${2:v} in ipairs(${3:table_name}) do\n\t${0:-- body...}\nend'
+  'for i=1,10':
+    'prefix': 'for'
+    'body': 'for ${1:i}=${2:1},${3:10} do\n\t${0:-- body...}\nend'
+  'for k,v in pairs()':
+    'prefix': 'forp'
+    'body': 'for ${1:k},${2:v} in pairs(${3:table_name}) do\n\t${0:-- body...}\nend'
+  'local function':
+    'prefix': 'lfun'
+    'body': 'local function ${1:FunctionName} (${2:args})\n\t${0:-- body...}\nend'
+  'local variable definition':
+    'prefix': 'local'
+    'body': 'local ${1:x} = ${0:1}'
+  'local variable definition shortcut':
+    'prefix': 'loc'
+    'body': 'local ${1:x} = ${0:1}'
+  'local table definition':
+    'prefix': 'ltab'
+    'body': 'local ${0:name} = {}'
+  'return definition':
+    'prefix': 'return'
+    'body': 'return ${0:value}'
+  'return definition shortcut':
+    'prefix': 'ret'
+    'body': 'return ${0:value}'
+  'print':
+    'prefix': 'print'
+    'body': 'print("${0:logging}")'


add snippets

add snippets

error: pathspec 'snippets/language-stan.cson' did not match any file(s) known to git

--- snippets/language-stan.cson
+++ snippets/language-stan.cson
@@ -0,0 +1,90 @@
+.source.stan:
+  'For':
+    'prefix': 'for'
+    'body': """
+    for (${1:var} in ${2:start}:${3:end}) {
+      ${4}'
+    }
+    """
+  'If':
+    'prefix': 'if'
+    'body': """
+    if (${1:condition}) {
+      ${2}
+    }
+    """
+  'Else If':
+    'prefix': 'ei'
+    'body': """
+    else  if (${1:condition}) {
+      ${2}
+    }
+    """
+  'Lower':
+    'prefix': "<l"
+    'body': '<lower = ${1:expression}>$2'
+  'Upper':
+    'prefix': "<u"
+    'content': '<upper = ${1:expression}>$2'
+  'Lower/Upper'
+    'prefix': "<lu"
+    'content': '<lower = ${1:expression}, upper = ${2:expression}>'
+  'While':
+    'prefix': 'while'
+    'content': """
+    while (${1:condition}) {
+      $2
+    }
+    """
+  'Transformed Parameters':
+    'prefix': 'tpar'
+    'body': """
+    transformed parameters {
+      $1
+    }
+    """
+  'Data':
+    'prefix': 'data'
+    'body': """
+    data {
+      $1
+    }
+    """
+  'Transformed Data':
+    'prefix': 'tdata'
+    'body': """
+    transformed data {
+      $1
+    }
+    """
+  'Generated Quantities':
+    'prefix': 'gen'
+    'body': """
+    generated quantities {
+      $1
+    }
+    """
+  'Model':
+    'prefix': 'mdl'
+    'body': """
+    model {
+      $1
+    }
+    """
+  'ODE':
+    'prefix': 'ode'
+    'body': 'integrate_ode(${1:function}, ${2:y0}, ${3:t0}, ${4:t}, ${5:theta}, ${6:x_r}, ${7:x_i});'
+  'Function block':
+    'prefix': 'funs'
+    'body': """
+    functions {
+      $1
+    }
+    """
+  'Function declaration':
+    'prefix': 'fun'
+    'body': """
+    ${1:return} ${2:name} (${3:args}) {
+      $4
+    }
+    """


Remove --include-deprecated-apis from apm test commands

--- build/tasks/spec-task.coffee
+++ build/tasks/spec-task.coffee
@@ -95,7 +95,7 @@
     if process.platform in ['darwin', 'linux']
       options =
         cmd: appPath
-        args: ['--test', "--resource-path=#{resourcePath}", "--spec-directory=#{coreSpecsPath}", '--include-deprecated-apis']
+        args: ['--test', "--resource-path=#{resourcePath}", "--spec-directory=#{coreSpecsPath}"]
         opts:
           env: _.extend({}, process.env,
             ATOM_INTEGRATION_TESTS_ENABLED: true
@@ -104,7 +104,7 @@
     else if process.platform is 'win32'
       options =
         cmd: process.env.comspec
-        args: ['/c', appPath, '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{coreSpecsPath}", '--log-file=ci.log', '--include-deprecated-apis']
+        args: ['/c', appPath, '--test', "--resource-path=#{resourcePath}", "--spec-directory=#{coreSpecsPath}", '--log-file=ci.log']
         opts:
           env: _.extend({}, process.env,
             ATOM_INTEGRATION_TESTS_ENABLED: true


Updates image updater script

Updates image updater script

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

--- coffee/tools/updateBilder.coffee
+++ coffee/tools/updateBilder.coffee
@@ -0,0 +1,64 @@
+#
+# Document update
+#
+# @database ntb_07
+# @collection bilder
+#
+# @author Hans Kristian Flaatten
+#
+
+"use strict"
+
+mongodb = require 'mongodb'
+database = require './../database.coffee'
+
+database.connect 'ntb_07', (err, db) ->
+  return console.log err if err
+
+  console.log 'Database connection is open'
+
+  db.collection 'bilder', (err, collection) ->
+    return console.log err if err
+
+    console.log "Collection is open"
+
+    collection.count (err, count) ->
+      console.log 'collection.count', count
+
+    #database.each collection.find().limit(200), (img, i, count, cb) ->
+    database.each collection.find(), (img, i, count, cb) ->
+      console.log i if i%100 is 0
+      parseTags = (j, tags, cb) ->
+        #console.log j, tags, tags.length
+        return cb(null, tags) if not tags or j is tags.length
+
+        tag = tags[j].split ':'
+        map = {trip:'turer', cabin:'steder'}
+
+        if tag.length isnt 2 or typeof map[tag[0]] is 'undefined'
+          return parseTags ++j, tags, cb
+
+        db.collection map[tag[0]], (err, col) ->
+          return praseTags ++j, tags, cb if err
+          database.each col.find({"privat.id":parseInt(tag[1])}), (doc, k, count, cb) ->
+            tags[j] = "#{tag[0]}:#{doc._id}" if doc isnt null
+            cb()
+          , (err, k, count) ->
+            parseTags ++j, tags, cb
+
+      parseTags 0, img.tags.slice(), (err, tags) ->
+        if err
+          console.log err if err
+          return cb()
+
+        img.tags = tags
+
+        collection.save img, (err, doc) ->
+          console.log err if err
+          cb()
+
+    , (err, i, count) ->
+      console.log err, i, count
+      db.close()
+
+


:memo: Use dot notation to refer to class methods in tests

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


Fix the docs

Fix the docs

--- apps/partner/client/router.coffee
+++ apps/partner/client/router.coffee
@@ -3,17 +3,17 @@

 module.exports = class ArtworkRouter extends Backbone.Router
   routes:
-                                              #   gallery | institution
-    ':id': 'index'       #      x         x
-    ':id/overview': 'overview'    #      x
-    ':id/shows': 'shows'       #      x         x
-    ':id/artists': 'artists'     #      x
-    ':id/artist/:artistId': 'artists'     #      x
-    ':id/collection': 'collection'  #                x
-    ':id/posts': 'posts'       #      x         x
-    ':id/shop': 'shop'        #                x
-    ':id/contact': 'contact'     #      x
-    ':id/about': 'about'       #                x
+                                      #   gallery | institution
+    ':id': 'index'                    #      x         x
+    ':id/overview': 'overview'        #      x
+    ':id/shows': 'shows'              #      x         x
+    ':id/artists': 'artists'          #      x
+    ':id/artist/:artistId': 'artists' #      x
+    ':id/collection': 'collection'    #                x
+    ':id/posts': 'posts'              #      x         x
+    ':id/shop': 'shop'                #                x
+    ':id/contact': 'contact'          #      x
+    ':id/about': 'about'              #                x

   initialize: (options) ->
     { @profile } = options


reordered the tinymce buttons

reordered the tinymce buttons

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


Ignore more script injection errors

Ignore more script injection errors

--- assets/javascripts/app/app.coffee
+++ assets/javascripts/app/app.coffee
@@ -56,6 +56,11 @@
           tags:
             mode: if @DOC then 'single' else 'full'
             iframe: (window.top isnt window).toString()
+          shouldSendCallback: ->
+            if @isInjectionError()
+              @onInjectionError()
+              return false
+            true
           dataCallback: (data) ->
             try
               $.extend(data.user ||= {}, app.settings.settings)
@@ -215,7 +220,7 @@
   isInjectionError: ->
     # Some browser extensions expect the entire web to use jQuery.
     # I gave up trying to fight back.
-    window.$ isnt app._$ or window.$$ isnt app._$$ or window.page isnt app._page
+    window.$ isnt app._$ or window.$$ isnt app._$$ or window.page isnt app._page or typeof $.empty isnt 'function' or typeof page.show isnt 'function'

   isAppError: (error, file) ->
     # Ignore errors from external scripts.


Don't hard-code API names

Don't hard-code API names

--- atom/common/api/lib/screen.coffee
+++ atom/common/api/lib/screen.coffee
@@ -4,14 +4,12 @@
   unless process.type is 'renderer' or require('app').isReady()
     throw new Error('Can not use screen module before the "ready" event of app module gets emitted')

-module.exports =
-  if process.platform in ['linux', 'win32'] and process.type is 'renderer'
-    # On Linux we could not access screen in renderer process.
-    require('remote').require 'screen'
-  else
-    getCursorScreenPoint: ->
-      checkAppIsReady()
-      binding.getCursorScreenPoint()
-    getPrimaryDisplay: ->
-      checkAppIsReady()
-      binding.getPrimaryDisplay()
+if process.platform in ['linux', 'win32'] and process.type is 'renderer'
+  # On Linux and Windows we could not access screen in renderer process.
+  module.exports = require('remote').require 'screen'
+else
+  for name, _ of binding
+    do (name) ->
+      module.exports[name] = (args...) ->
+        checkAppIsReady()
+        binding[name](args...)


Google translate multiple sentences

Google translate multiple sentences

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


support for search types

support for search types

Signed-off-by: Sakchai Siripanyawuth <50d2926f6b388f0d7169db5beff2dc87e1537d54@artellectual.com>

--- vendor/assets/javascripts/simple_datatables.js.coffee
+++ vendor/assets/javascripts/simple_datatables.js.coffee
@@ -43,8 +43,8 @@
   $.each(aoData, (index, dataObj) ->
     search_regexp = ///sSearch_([0-9]+)///
     if (col = dataObj.name.match(search_regexp)) and dataObj.value
-      console.log dataObj
-      data.push({name: "search["+columns[col[1]]+"]", value: dataObj.value});
+      search_value = dataObj.split('|')
+      data.push({name: "search["+columns[col[1]]+ search_value[1] +"]", value: searc_value[0]});

     search_regexp = ///bSearchable_([0-9]+)///
     if (col = dataObj.name.match(search_regexp)) and dataObj.value


Add description field to template definition

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


Button coffee script example

Button coffee script example

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

--- components/button/index.coffee
+++ components/button/index.coffee
@@ -0,0 +1,2 @@
+for i in [0..3]
+  console.log(i + ' THIS IS A TEST LOOP') // Button


tone the session_middleware() warning down to debug

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/smurp/email-login.git/'


used fat arrow for callback method that references instance field

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/fbergin/timeline-stats.git/'


Move the search string tester into its own method.

--- coffee/lib/abstract-chosen.coffee
+++ coffee/lib/abstract-chosen.coffee
@@ -126,18 +126,8 @@
           option.search_match = false

           search_string = if option.group then option.label else option.html
-
-          if regex.test search_string
-            option.search_match = true
-            results += 1
-          else if @enable_split_word_search and (search_string.indexOf(" ") >= 0 or search_string.indexOf("[") == 0)
-            #TODO: replace this substitution of /\[\]/ with a list of characters to skip.
-            parts = search_string.replace(/\[|\]/g, "").split(" ")
-            if parts.length
-              for part in parts
-                if regex.test part
-                  option.search_match = true
-                  results += 1
+          option.search_match = this.search_string_match(search_string, regex)
+          results += 1 if option.search_match

           if option.search_match and not option.group
             if searchText.length
@@ -161,6 +151,17 @@
     else
       this.update_results_content this.results_option_build()
       this.winnow_results_set_highlight()
+
+  search_string_match: (search_string, regex) ->
+    if regex.test search_string
+      return true
+    else if @enable_split_word_search and (search_string.indexOf(" ") >= 0 or search_string.indexOf("[") == 0)
+      #TODO: replace this substitution of /\[\]/ with a list of characters to skip.
+      parts = search_string.replace(/\[|\]/g, "").split(" ")
+      if parts.length
+        for part in parts
+          if regex.test part
+            return true

   choices_count: ->
     return @selected_option_count if @selected_option_count?


Bugfix.

Bugfix.

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


Use presenter for rendering overlay decorations

We’re still doing some sync DOM reads and computation in the view that
should eventually be made async and moved into the presenter, but I’m
going to leave it alone for now.

--- src/overlay-manager.coffee
+++ src/overlay-manager.coffee
@@ -1,47 +1,42 @@
 module.exports =
 class OverlayManager
   constructor: (@container) ->
-    @overlays = {}
+    @overlayNodesById = {}

   render: (props) ->
-    {presenter, editor, overlayDecorations} = props
-    lineHeight = presenter.getLineHeight()
+    {presenter} = props

-    existingDecorations = null
-    for markerId, {headPixelPosition, tailPixelPosition, decorations} of overlayDecorations
-      for decoration in decorations
-        pixelPosition =
-          if decoration.position is 'tail' then tailPixelPosition else headPixelPosition
+    for decorationId, {pixelPosition, item} of presenter.state.content.overlays
+      @renderOverlay(presenter, decorationId, item, pixelPosition)

-        @renderOverlay(editor, decoration, pixelPosition, lineHeight)
-
-        existingDecorations ?= {}
-        existingDecorations[decoration.id] = true
-
-    for id, overlay of @overlays
-      unless existingDecorations? and id of existingDecorations
-        @container.removeChild(overlay)
-        delete @overlays[id]
+    for id, overlayNode of @overlayNodesById
+      unless presenter.state.content.overlays.hasOwnProperty(id)
+        overlayNode.remove()
+        delete @overlayNodesById[id]

     return

-  renderOverlay: (editor, decoration, pixelPosition, lineHeight) ->
-    item = atom.views.getView(decoration.item)
-    unless overlay = @overlays[decoration.id]
-      overlay = @overlays[decoration.id] = document.createElement('atom-overlay')
-      overlay.appendChild(item)
-      @container.appendChild(overlay)
+  renderOverlay: (presenter, decorationId, item, pixelPosition) ->
+    item = atom.views.getView(item)
+    unless overlayNode = @overlayNodesById[decorationId]
+      overlayNode = @overlayNodesById[decorationId] = document.createElement('atom-overlay')
+      overlayNode.appendChild(item)
+      @container.appendChild(overlayNode)

     itemWidth = item.offsetWidth
     itemHeight = item.offsetHeight

+
+    {scrollTop} = presenter.state
+    {scrollLeft} = presenter.state.content
+
     left = pixelPosition.left
-    if left + itemWidth - editor.getScrollLeft() > editor.getWidth() and left - itemWidth >= editor.getScrollLeft()
+    if left + itemWidth - scrollLeft > presenter.getClientWidth() and left - itemWidth >= scrollLeft
       left -= itemWidth

-    top = pixelPosition.top + lineHeight
-    if top + itemHeight - editor.getScrollTop() > editor.getHeight() and top - itemHeight - lineHeight >= editor.getScrollTop()
-      top -= itemHeight + lineHeight
+    top = pixelPosition.top + presenter.getLineHeight()
+    if top + itemHeight - scrollTop > presenter.getClientHeight() and top - itemHeight - presenter.getLineHeight() >= scrollTop
+      top -= itemHeight + presenter.getLineHeight()

-    overlay.style.top = top + 'px'
-    overlay.style.left = left + 'px'
+    overlayNode.style.top = top + 'px'
+    overlayNode.style.left = left + 'px'


dem sloppy typos

dem sloppy typos

--- resource/translators/translator.coffee
+++ resource/translators/translator.coffee
@@ -399,7 +399,7 @@
     tag = tag.replace(/,/g, ';')

     # verbatim fields require balanced braces -- please just don't use braces in your tags
-    tag = tag.replace(/{/g, '('),replace(/}/g, ')') if tag != BetterBibTeXBraceBalancer.parse(tag)
+    tag = tag.replace(/{/g, '(').replace(/}/g, ')') if tag != BetterBibTeXBraceBalancer.parse(tag)
     tag

   return tags.join(',')


check in initial contact_forms js

check in initial contact_forms js

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

--- app/assets/javascripts/contact_forms.js.coffee
+++ app/assets/javascripts/contact_forms.js.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/


Fix username in response

Fix username in response

--- src/scripts/whoisout.coffee
+++ src/scripts/whoisout.coffee
@@ -29,7 +29,7 @@
     thisDate = plugin.parseDate msg.match[1]?.trim()
     if thisDate
       plugin.save robot, thisDate, msg.message
-      msg.send "ok, #{msg.user.name} is out on #{thisDate}"
+      msg.send "ok, #{msg.message.user.name} is out on #{thisDate}"
     else
       msg.send 'unable to save date'


ComputeController: decrease the general timeout

--- client/Main/providers/computecontroller.coffee
+++ client/Main/providers/computecontroller.coffee
@@ -2,7 +2,7 @@

   @providers = KD.config.providers

-  @timeout = 30000
+  @timeout = 15000

   constructor:->


video: fix streamCreated to publish if not already

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


changed example's bandit-server

changed example's bandit-server

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/peleteiro/angular-bandit-client.git/'


Test mathjax helpers

Test mathjax helpers

error: pathspec 'test/helpers/mathjax.spec.coffee' did not match any file(s) known to git

--- test/helpers/mathjax.spec.coffee
+++ test/helpers/mathjax.spec.coffee
@@ -0,0 +1,41 @@
+{Testing, expect, sinon, _} = require './index'
+
+{typesetMath} = require 'helpers/mathjax'
+FakeWindow = require './fake-window'
+
+callTypeset = (dom, window) ->
+  new Promise( ( res, rej ) ->
+    typesetMath(dom, window)
+    _.delay ->
+      res(dom)
+    , 110
+  )
+
+
+describe 'Mathjax Helper', ->
+
+  beforeEach ->
+    @dom = document.createElement('div')
+    @window = new FakeWindow
+    @window.MathJax = { Hub: {Typeset: sinon.spy(), Queue: sinon.spy()} }
+    @window.document = @dom
+
+  it 'can typeset latex', ->
+    @dom.innerHTML = '
a pi symbol
'
+    callTypeset(@dom, @window).then =>
+      expect( @window.MathJax.Hub.Typeset ).to.have.been.calledWith([@dom.children[0]])
+      expect( @dom.textContent ).to.include('\\pi')
+
+
+  it 'typesets document with mathml is present', ->
+    @dom.innerHTML = '''
+      <math xmlns="http://www.w3.org/1998/Math/MathML"1
+            display="inline">2
+        <mrow>
+          <mi>PI</mi>
+        </mrow>
+      </math>
+    '''
+    callTypeset(@dom, @window).then =>
+      expect( @window.MathJax.Hub.Typeset ).to.have.been.calledWith(@window.document)
+      expect( @dom.textContent ).to.include('PI')


Added patches file

Added patches file

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

--- src/typhoon/patches.coffee
+++ src/typhoon/patches.coffee
@@ -0,0 +1,84 @@
+fs = require 'fs'
+haml = require 'hamljs'
+
+###
+Render a file containing haml
+###
+
+haml.renderFile = (filename, encoding, options, callback) ->
+  options or= {}
+  options.filename or= filename
+  options.cache = true unless options.hasOwnProperty 'cache'
+
+  if haml.cache[filename] && options.cache
+    process.nextTick ->
+      callback null, haml.render(null, options)
+  else
+    fs.readFile filename, encoding, (err, str) ->
+      if err
+        callback err
+      else
+        callback null, haml.render(str, options)
+
+###
+Prefix numbers less than 10 with a 0
+###
+Number.prototype.pad = ->
+  if this < 10
+    "0" + @toString()
+  else
+    return @toString()
+
+###
+Pretty dates i.e. January 2, 2011
+###
+
+Date.prototype.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
+Date.prototype.days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
+
+Date.prototype.pretty = ->
+  @months[@getUTCMonth()] + ' ' + @getUTCDate() + ', ' + @getUTCFullYear()
+
+###
+Format a date to RFC822 (used in feeds)
+###
+
+Date.prototype.rfc822 = ->
+  @days[@getUTCDay()][0..2] + ', ' +
+  @getUTCDate().pad() + ' ' +
+  @months[@getUTCMonth()][0..2] + ' ' +
+  @getUTCFullYear() + ' ' +
+  @getUTCHours().pad() + ':' +
+  @getUTCMinutes().pad() + ':' +
+  @getUTCSeconds().pad() + ' ' + 'GMT'
+
+###
+Slugify a string
+###
+
+String.prototype.slug = ->
+  str = this
+
+  # Trim spaces
+  str = str.replace /^\s+|\s+$/g, ''
+
+  # Lowercase
+  str = str.toLowerCase()
+
+  # Remove accents by swapping
+  from = 'àáäâèéëêìíïîòóöôùúüûñç·/_,:;'
+  to = 'aaaaeeeeiiiioooouuuunc------'
+
+  for char, i in from
+    str = str.replace new RegExp(char, 'g'), to.charAt i
+
+  # Remove uncatched invalid chars
+  str = str.replace /[^a-z0-9\s\-]/g, ''
+
+  # Collapse spaces and replace with dashes
+  str = str.replace /\s+/g, '-'
+
+  # Collapse dashes
+  str = str.replace /-+/g, '-'
+
+  str


initial tokens are an array, not an object

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


Adapt promisfy to bluebird 3.0

Adapt promisfy to bluebird 3.0

By default, promisify only takes one argument in bluebird 3
http://bluebirdjs.com/docs/new-in-bluebird-3.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/actano/advocate.git/'


Fixed typo in Event template

Fixed typo in Event template

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


unwrap message from JSON and prefix it with the message source before piping to console

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


Add basic integration spec

Add basic integration spec

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

--- spec/integration/changes-spec.coffee
+++ spec/integration/changes-spec.coffee
@@ -0,0 +1,28 @@
+path = require 'path'
+fs = require 'fs'
+
+describe 'View and Commit Changes', ->
+  workspaceElement = null
+
+  beforeEach ->
+    workspaceElement = atom.views.getView(atom.workspace)
+    projectPath = path.join(__dirname, '../fixtures/a')
+    atom.project.setPaths([projectPath])
+    waitsForPromise ->
+      atom.packages.activatePackage('git')
+
+  dispatchCommand = (command) ->
+    commandText = "git:#{command}"
+    atom.commands.dispatch(workspaceElement, commandText)
+
+  describe 'editing an existing file', ->
+    it 'Shows the change in the changes list', ->
+      projectPath = path.join(__dirname, '../fixtures/a')
+      fs.writeFileSync(path.join(projectPath, 'foo.md'), 'some more text')
+      dispatchCommand('view-and-commit-changes')
+
+      waitsFor "changes view to open", ->
+        workspaceElement.querySelector('git-changes-view')?
+
+      runs ->
+        expect(workspaceElement.querySelector('.unstaged.files').innerHTML).toContain('foo.md')


Reduce slider spec timeout again.

Reduce slider spec timeout again.

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


Client: Activity: Added user actions for createchannel module

error: pathspec 'client/activity/lib/flux/createchannel/actions/user.coffee' did not match any file(s) known to git

--- client/activity/lib/flux/createchannel/actions/user.coffee
+++ client/activity/lib/flux/createchannel/actions/user.coffee
@@ -0,0 +1,97 @@
+kd          = require 'kd'
+actionTypes = require './actiontypes'
+
+{ actions: appActions } = require 'app/flux'
+
+
+dispatch = (args...) -> kd.singletons.reactor.dispatch args...
+
+
+###*
+ * Action to set current query of create channel modal participants.
+ * Also, it resets users selected index and loads users
+ * filtered by query if query is not empty
+ *
+ * @param {string} query
+###
+setInputQuery = (query) ->
+
+  if query
+    { SET_CREATE_NEW_CHANNEL_PARTICIPANTS_QUERY } = actionTypes
+    dispatch SET_CREATE_NEW_CHANNEL_PARTICIPANTS_QUERY, { query }
+    resetSelectedIndex()
+    appActions.user.searchAccounts query
+
+  else
+    unsetInputQuery()
+
+
+###*
+ * Action to unset current query of create channel participants.
+ * Also, it resets users selected index
+###
+unsetInputQuery = ->
+
+  { UNSET_CREATE_NEW_CHANNEL_PARTICIPANTS_QUERY } = actionTypes
+  dispatch UNSET_CREATE_NEW_CHANNEL_PARTICIPANTS_QUERY
+  resetSelectedIndex()
+
+
+###*
+ * Action to reset users selected index to initial value
+###
+resetSelectedIndex = ->
+
+  { RESET_CREATE_NEW_CHANNEL_PARTICIPANTS_SELECTED_INDEX } = actionTypes
+  dispatch RESET_CREATE_NEW_CHANNEL_PARTICIPANTS_SELECTED_INDEX
+
+
+###*
+ * Action to set selected index of create channel participants.
+ *
+ * @param {number} index
+###
+setSelectedIndex = (index) ->
+
+  { SET_CREATE_NEW_CHANNEL_PARTICIPANTS_SELECTED_INDEX } = actionTypes
+  dispatch SET_CREATE_NEW_CHANNEL_PARTICIPANTS_SELECTED_INDEX, { index }
+
+
+###*
+ * Action to increment users selected index
+###
+moveToNextIndex = ->
+
+  { MOVE_TO_NEXT_CREATE_NEW_CHANNEL_PARTICIPANT_INDEX } = actionTypes
+  dispatch MOVE_TO_NEXT_CREATE_NEW_CHANNEL_PARTICIPANT_INDEX
+
+
+###*
+ * Action to decrement users selected index
+###
+moveToPrevIndex = ->
+
+  { MOVE_TO_PREV_CREATE_NEW_CHANNEL_PARTICIPANT_INDEX } = actionTypes
+  dispatch MOVE_TO_PREV_CREATE_NEW_CHANNEL_PARTICIPANT_INDEX
+
+
+###*
+ * Action to set visibility of create channel dropdown visibility
+###
+setDropdownVisibility = (visible) ->
+
+  { SET_CREATE_NEW_CHANNEL_PARTICIPANTS_DROPDOWN_VISIBILITY } = actionTypes
+  dispatch SET_CREATE_NEW_CHANNEL_PARTICIPANTS_DROPDOWN_VISIBILITY, { visible }
+
+
+
+module.exports = {
+  setInputQuery
+  unsetInputQuery
+  resetSelectedIndex
+  setSelectedIndex
+  moveToNextIndex
+  moveToPrevIndex
+  setDropdownVisibility
+}
+


openURL examples fixed and verified

openURL examples fixed and verified


Fix typos in Scenario extension

Fix typos in Scenario extension


remove all aliases on itemViewClass for poplist

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


more comments for poplist

more comments for poplist