Throttle down being an asshole by 0.0001

--- tests/ayp_test.coffee
+++ tests/ayp_test.coffee
@@ -4,6 +4,6 @@
 helper = new Helper('../scripts/dice.coffee')

-describe 'it compiles', ->
+describe 'AYP', ->
   it 'compiled if it got this fucking far', ->
     assert helper


add conflict handler test file

add conflict handler test file

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

--- tests/conflict.coffee
+++ tests/conflict.coffee
@@ -0,0 +1,55 @@
+async = require 'async'
+request = require 'request-json-light'
+should = require 'should'
+date = require 'date-utils'
+
+config      = require '../backend/config'
+replication = require '../backend/replication'
+binary      = require '../backend/binary'
+pouch       = require '../backend/db'
+
+helpers = require './helpers/helpers'
+cliHelpers = require './helpers/cli'
+fileHelpers = require './helpers/files'
+
+params =
+    url: 'http://localhost:9104/'
+
+
+describe "Conflict Tests", ->
+
+    before cliHelpers.resetDatabase
+    after cliHelpers.resetDatabase
+
+    createBinary = (i, callback) ->
+        pouch.db.put
+            _id: "binary-#{i}"
+            docType: 'Binary'
+            binary:
+                file:
+                    id: "binary-#{i}"
+        , callback
+
+    createFile = (i, callback) ->
+        pouch.db.put
+            _id: "file-#{i}"
+            docType: 'File'
+            path: 'myfolder'
+            name: "filename-#{i}"
+        , callback
+
+    createFolder = (i, callback) ->
+        pouch.db.put
+            _id: "folder-#{i}"
+            docType: 'Folder'
+            path: 'myfolder'
+            name: "folder-#{i}"
+        , callback
+
+    before (done) ->
+        async.eachSeries [1..3], createBinary, ->
+            async.eachSeries [1..3], createFile, ->
+                async.eachSeries [1..3], createFolder, done
+
+
+    describe 'handleConflict', ->


test content based updates

test content based updates

error: pathspec 'test/components/reference-book/teacher-content-toggle.spec.coffee' did not match any file(s) known to git

--- test/components/reference-book/teacher-content-toggle.spec.coffee
+++ test/components/reference-book/teacher-content-toggle.spec.coffee
@@ -0,0 +1,42 @@
+{Testing, expect, sinon, _} = require '../helpers/component-testing'
+
+Toggle = require '../../../src/components/reference-book/teacher-content-toggle'
+
+describe 'Teacher Content Toggle', ->
+
+  beforeEach ->
+    @props =
+      onChange: sinon.spy()
+      isShowing: false
+      windowImpl:
+        document: document.createElement('div')
+
+  it 'defaults to not showing teacher content', (done) ->
+    Testing.renderComponent( Toggle, props: @props ).then ({element}) =>
+      expect(element.getDOMNode().querySelector('.no-content')).to.exist
+      Testing.actions.click(element.getDOMNode())
+      _.defer =>
+        expect(@props.onChange).not.to.have.been.called
+        done()
+
+  it 'can detect teacher selector', (done) ->
+    @props.windowImpl.document.innerHTML = """
+

Hai I AM TEACHER

+    """
+    Testing.renderComponent( Toggle, props: @props, unmountAfter: 10 ).then ({element}) ->
+      _.defer ->
+        expect(element.state.hasTeacherContent).to.be.true
+        done()
+
+
+  it 'calls callback when clicked and content is available', (done) ->
+    @props.windowImpl.document.innerHTML = """
+

Hai I AM TEACHER

+    """
+    Testing.renderComponent( Toggle, props: @props, unmountAfter: 10 ).then ({element}) =>
+
+      Testing.actions.click(element.getDOMNode())
+      _.defer =>
+        expect(element.getDOMNode().textContent).to.include("Show")
+        expect(@props.onChange).to.have.been.calledWith(true)
+        done()


Follow error handling rules.

Follow error handling rules.

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


Don't reassign domain name.

Don't reassign domain name.


activity: add CollaborationChannelParticipantsModel

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

--- client/activity/lib/models/collaborationchannelparticipants.coffee
+++ client/activity/lib/models/collaborationchannelparticipants.coffee
@@ -0,0 +1,114 @@
+_         = require 'lodash'
+immutable = require 'immutable'
+ChannelParticipantsModel = require './channelparticipants'
+
+module.exports = class CollaborationChannelParticipantsModel extends ChannelParticipantsModel
+
+  defaultState:
+    videoActive: no
+    selectedParticipant: null
+    talkingParticipants: []
+    videoParticipants: []
+
+  constructor: (options = {}, data) ->
+
+    super options, data
+
+    @state = _.assign {}, @defaultState, options.state
+
+
+  computePreviewParticipants: (participants) ->
+
+    if @state.videoActive
+      return participants.filter (participant) =>
+        participant.profile.nickname in @state.videoParticipants
+
+    super
+
+
+  computeHiddenParticipants: (participants) ->
+
+    if @state.videoActive
+      return participants.filter (participant) =>
+        {nickname} = participant.profile
+        return @state.videoParticipants.indexOf(nickname) is -1
+
+    super
+
+
+  addVideoParticipant: (nickname, emitEvent = yes) ->
+
+    index = @state.videoParticipants.indexOf nickname
+
+    if index is -1
+      @state.videoParticipants.push nickname  if index is -1
+      @emitChange()  if emitEvent
+
+
+  removeVideoParticipant: (nickname, emitEvent = yes) ->
+
+    index = @state.videoParticipants.indexOf nickname
+
+    unless index is -1
+      @state.videoParticipants.splice index, 1
+      @emitChange()  if emitEvent
+
+
+  setVideoSelectedParticipant: (nickname) ->
+
+    @state.selectedParticipant = nickname
+
+    @emitChange()
+
+
+  addTalkingParticipant: (nickname) ->
+
+    index = @state.talkingParticipants.indexOf nickname
+
+    if index is -1
+      @state.talkingParticipants.push nickname  if index is -1
+      @emitChange()
+
+
+  removeTalkingParticipant: (nickname) ->
+
+    index = @state.talkingParticipants.indexOf nickname
+
+    unless index is -1
+      @state.talkingParticipants.splice index, 1
+      @emitChange()
+
+
+  addVideoActiveParticipant: (nickname) ->
+
+    index = @state.videoParticipants.indexOf nickname
+
+    if index is -1
+      @state.videoParticipants.push nickname  if index is -1
+      @emitChange()
+
+
+  removeVideoActiveParticipant: (nickname) ->
+
+    index = @state.videoParticipants.indexOf nickname
+
+    unless index is -1
+      @state.videoParticipants.splice index, 1
+      @emitChange()
+
+
+  emitChange: -> @emit 'change', @getLists(), @state
+
+
+  setVideoState: (state, participants) ->
+
+    @state.videoActive = state
+
+    if @state.videoActive
+      # add video participant without emitting event.
+      participants.map (p) => @addVideoParticipant p, no
+
+      # basically we batched the change event updates.
+      @emitChange()
+
+


Update Karma config, attempt to correct CI build error on Firefox 30.

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


only sort biblatexdata for tests

only sort biblatexdata for tests

error: pathspec 'resource/translators/Better' did not match any file(s) known to git
error: pathspec 'BibTeX.coffee' did not match any file(s) known to git


Update and add test cases.

Update and add test cases.

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/appneta/hubot-jenkins-deploy.git/'


bug fix

bug fix

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


added iot-app-controller

added iot-app-controller

error: pathspec 'src/controllers/iot-app-controller.coffee' did not match any file(s) known to git

--- src/controllers/iot-app-controller.coffee
+++ src/controllers/iot-app-controller.coffee
@@ -0,0 +1,38 @@
+_                      = require 'lodash'
+async                  = require 'async'
+debug                  = require('debug')('nanocyte-flow-deploy-service:iot-app-controller')
+redis                  = require 'ioredis'
+MeshbluConfig          = require 'meshblu-config'
+MeshbluHttp            = require 'meshblu-http'
+client                 = redis.createClient process.env.REDIS_PORT, process.env.REDIS_HOST, auth_pass: process.env.REDIS_PASSWORD, dropBufferSupport: true
+
+class IotAppController
+  constructor: (dependencies={}) ->
+    {@NanocyteDeployer, @UUID} = dependencies
+    @meshbluConfig = new MeshbluConfig
+
+  link: (req, res) =>
+    {appId, version} = req.params
+    config           = req.body
+    flowId           = req.meshbluAuth.uuid
+    @meshbluHttp     = @_createMeshbluHttp req.meshbluAuth
+    console.log JSON.stringify config, null, 2
+
+    {instanceId} = config
+    console.log 'instanceId', instanceId
+    configSchema = config.schemas?.configure?.iotApp
+    console.log 'configSchema', JSON.stringify configSchema
+    return res.sendStatus(422) unless configSchema? and instanceId?
+    @meshbluHttp.device appId, (error) =>
+      return res.sendStatus(403) if error?
+      configurationSaver = new ConfigurationSaver client
+      configurationSaver.saveIotApp {flowId, instanceId, appId, version, configSchema, config}, (error) =>
+        return res.status(error.code || 500).send({error}) if error?
+        res.sendStatus 201
+
+  _createMeshbluHttp: (options) =>
+    meshbluJSON = _.assign {}, @meshbluConfig.toJSON(), options
+    new MeshbluHttp meshbluJSON
+
+
+module.exports = IotAppController


Added test for defining functions in functions.

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

--- test/flow_spec.coffee
+++ test/flow_spec.coffee
@@ -0,0 +1,18 @@
+Aether = require '../aether'
+
+describe "Flow test suite", ->
+  describe "Defining functions", ->
+    aether = new Aether()
+    it "should be able to define functions in functions", ->
+      code = """
+        function fib(n) {
+          return n < 2 ? n : fib(n - 1) + fib(n - 2);
+        var chupacabra = fib(5)
+        //console.log("I want", chupacabra, "gold.");
+        return chupacabra;
+      """
+      aether.transpile(code)
+      fn = aether.createFunction()
+      fn()
+      fn()
+      fn()


Fix the Writable implementation for our devnull

--- test/analytics.coffee
+++ test/analytics.coffee
@@ -60,7 +60,7 @@
         # create a null reader for it
         devnull = new (
             class extends (require "stream").Writable
-                write: (chunk,encoding,cb) ->
+                _write: (chunk,encoding,cb) ->
                     cb()
         )


client/app: remove openIdeByMachine util

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


Stack-Editor: openStackWizard on top of everything as a modal


MIL-291: Fix AngularJS 1.3 issue with invalid fields not updating model by immediately clearing server-side invalidated inputs on change

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/crdschurch/crds-angular-ajax-form.git/'


stub path view

stub path view

error: pathspec 'components/path/client/path_view.coffee' did not match any file(s) known to git

--- components/path/client/path_view.coffee
+++ components/path/client/path_view.coffee
@@ -0,0 +1,12 @@
+_ = require 'underscore'
+sd = require('sharify').data
+Backbone = require 'backbone'
+Backbone.$ = $
+mediator = require '../../../lib/mediator.coffee'
+
+module.exports = class PathView extends Backbone.View
+
+  initialize: (options) ->
+    super
+
+    console.log 'init PathView'


Handle deleting autocomplete-plus when symlink and dir

--- src/package-manager.coffee
+++ src/package-manager.coffee
@@ -421,8 +421,10 @@

     if packageDir?
       autocompletePlusPath = path.join(packageDir, 'autocomplete-plus')
-      fs.isDirectory autocompletePlusPath, (isDir, error) ->
-        fs.unlink(autocompletePlusPath) if isDir
+      if fs.isSymbolicLinkSync(autocompletePlusPath)
+        fs.unlink(autocompletePlusPath)
+      else if fs.isDirectorySync(autocompletePlusPath)
+        fs.remove(autocompletePlusPath, ->)

 if Grim.includeDeprecatedAPIs
   EmitterMixin = require('emissary').Emitter


Make function comment accurate

Make function comment accurate

--- src/stdlib/fs-utils.coffee
+++ src/stdlib/fs-utils.coffee
@@ -102,8 +102,7 @@
   move: (source, target) ->
     fs.renameSync(source, target)

-  # Remove a file at the given path. Throws an error if path is not a
-  # file or a symbolic link to a file.
+  # Remove the file or directory at the given path.
   remove: (pathToRemove) ->
     rimraf.sync(pathToRemove)


Fix -> add integration test for skipping error product when importing

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

--- test/integration/product-import.spec.coffee
+++ test/integration/product-import.spec.coffee
@@ -0,0 +1,192 @@
+debug = require('debug')('spec:it:sphere-product-import')
+_ = require 'underscore'
+_.mixin require 'underscore-mixins'
+{ ProductImport } = require '../../lib'
+ClientConfig = require '../../config'
+Promise = require 'bluebird'
+{ ExtendedLogger } = require 'sphere-node-utils'
+package_json = require '../../package.json'
+
+sampleProductTypeForProduct =
+  name: 'productTypeForProductImport'
+  description: 'test description'
+
+createProduct = () ->
+  [
+    {
+      productType:
+        typeId: 'product-type'
+        id: 'productTypeForProductImport'
+      name:
+        en: 'foo'
+      slug:
+        en: 'foo'
+      masterVariant:
+        sku: 'sku1'
+      variants: [
+        {
+          sku: 'sku2',
+          prices: [{ value: { centAmount: 777, currencyCode: 'JPY' } }]
+        }
+        {
+          sku: 'sku3',
+          prices: [{ value: { centAmount: 9, currencyCode: 'GBP' } }]
+        }
+      ],
+      categories: [
+        {
+          id: 'test-category'
+        }
+      ]
+    },
+    {
+      productType:
+        typeId: 'product-type'
+        id: 'productTypeForProductImport'
+      name:
+        en: 'no-category'
+      slug:
+        en: 'no-category'
+      masterVariant:
+        sku: 'sku4'
+      variants: [
+        {
+          sku: 'sku5',
+          prices: [{ value: { centAmount: 777, currencyCode: 'JPY' } }]
+        }
+        {
+          sku: 'sku6',
+          prices: [{ value: { centAmount: 9, currencyCode: 'GBP' } }]
+        }
+      ],
+      categories: [
+        {
+          id: 'not-existing-category'
+        }
+      ]
+    },
+    {
+      productType:
+        typeId: 'product-type'
+        id: 'productTypeForProductImport'
+      name:
+        en: 'foo2'
+      slug:
+        en: 'foo2'
+      masterVariant:
+        sku: 'sku7'
+      variants: [
+        {
+          sku: 'sku8',
+          prices: [{ value: { centAmount: 777, currencyCode: 'JPY' } }]
+        }
+        {
+          sku: 'sku9',
+          prices: [{ value: { centAmount: 9, currencyCode: 'GBP' } }]
+        }
+      ],
+      categories: [
+        {
+          id: 'test-category'
+        }
+      ]
+    }
+  ]
+
+sampleCategory =
+  name:
+    en: 'Test category'
+  slug:
+    en: 'test-category'
+  externalId: 'test-category'
+
+sampleCustomerGroup =
+  groupName: 'test-group'
+
+sampleChannel =
+  key: 'test-channel'
+
+ensureResource = (service, predicate, sampleData) ->
+  debug 'Ensuring existence for: %s', predicate
+  service.where(predicate).fetch()
+  .then (result) ->
+    if result.statusCode is 200 and result.body.count is 0
+      service.create(sampleData)
+      .then (result) ->
+        debug "Sample #{predicate} created with id: #{result.body.id}"
+        Promise.resolve(result.body)
+    else
+      Promise.resolve(result.body.results[0])
+
+logger = new ExtendedLogger
+  additionalFields:
+    project_key: ClientConfig.config.project_key
+  logConfig:
+    name: "#{package_json.name}-#{package_json.version}"
+    streams: [
+      { level: 'error', stream: process.stderr },
+      { level: 'debug', stream: process.stdout }
+    ]
+
+Config =
+  clientConfig: ClientConfig
+  errorLimit: 0
+
+describe 'Product Importer integration tests', ->
+
+  beforeEach (done) ->
+    @import = new ProductImport logger, Config
+
+    @client = @import.client
+
+    logger.info 'About to setup...'
+    ensureResource(@client.productTypes, 'name="productTypeForProductImport"', sampleProductTypeForProduct)
+    .then (@productType) => ensureResource(@client.customerGroups, 'name="test-group"', sampleCustomerGroup)
+    .then (@customerGroup) => ensureResource(@client.channels, 'key="test-channel"', sampleChannel)
+    .then (@channel) =>
+      ensureResource(@client.categories, 'externalId="test-category"', sampleCategory)
+    .then (@category) =>
+      done()
+    .catch (err) ->
+      done(_.prettify err)
+  , 30000 # 30sec
+
+  afterEach (done) ->
+    logger.info 'About to cleanup...'
+    @client.productProjections.staged(true)
+      .all()
+      .where("productType(id=\"#{@productType.id}\")")
+      .fetch()
+      .then (result) =>
+        Promise.map result.body.results, (result) =>
+          cleanup(logger, @client.products, result.id)
+      .then => cleanup(logger, @client.productTypes, @productType.id)
+      .then => cleanup(logger, @client.customerGroups, @customerGroup.id)
+      .then => cleanup(logger, @client.channels, @channel.id)
+      .then => cleanup(logger, @client.categories, @category.id)
+      .then -> done()
+      .catch (err) -> done(_.prettify err)
+  , 30000 # 30sec
+
+
+  cleanup = (logger, service, id) ->
+    service.byId(id).fetch()
+    .then (result) ->
+      service.byId(id).delete(result.body.version)
+    .then (result) ->
+      Promise.resolve()
+
+
+  it 'should skip and continue on category not found', (done) ->
+    productDrafts = createProduct()
+    @import.performStream(productDrafts, () => {})
+    .then () =>
+      @client.productProjections.staged(true)
+      .all()
+      .where("productType(id=\"#{@productType.id}\")")
+      .fetch()
+      .then (result) =>
+        expect(result.body.results.length).toBe(2)
+        done()
+  , 30000
+


Create project model

Create project model

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

--- app/assets/javascripts/models/project.coffee
+++ app/assets/javascripts/models/project.coffee
@@ -0,0 +1,14 @@
+Dashboard.Project = DS.Model.extend
+  name: DS.attr('string')
+  permalink: DS.attr('string')
+  category: DS.attr('string')
+  user_id: DS.attr('string')
+  goal: DS.attr('string')
+  pledged: DS.attr('string')
+  total_contributions: DS.attr('string')
+  recommended: DS.attr('string')
+  featured: DS.attr('string')
+  home_page: DS.attr('string')
+  online_date: DS.attr('date')
+  expires_at: DS.attr('date')
+  state: DS.attr('string')


feat:liveworld Demo KBC project and Erik project sardine enable

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


Add datastream model

Add datastream model

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

--- app/assets/javascripts/workbench/workbench/models/datastream.js.coffee
+++ app/assets/javascripts/workbench/workbench/models/datastream.js.coffee
@@ -0,0 +1,5 @@
+class Workbench.Models.Datastream extends Backbone.Model
+  initialize: ->
+
+class Workbench.Collections.DatastreamsCollection extends Backbone.Collection
+  model: Workbench.Models.Datastream


Use this.App to destroy properly

Use this.App to destroy properly

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/zafacon/ember-cli-mocha-coffeescript.git/'


add lock manager

add lock manager

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

--- config/initializers/queue.coffee
+++ config/initializers/queue.coffee
@@ -0,0 +1,39 @@
+# Locker needed because of the asynchronous behaviour of nodejs. The same
+# data can be modified by two requests at the same time because node handle
+# both requests without waiting the database response. So with this lock
+# this system, it a data is accessed next request wait until data get free
+# before being executed.
+# A lock has time to live of 2s
+class DataLock
+
+    constructor: ->
+        @locks = {}
+
+    # True if lock is set.
+    isLock: (lock) ->
+        @locks[lock]
+
+    # Create a new lock with a 2s TTL
+    addLock: (lock) ->
+        if not @isLock[lock]
+            @locks[lock] = true
+            setTimeout =>
+                if @isLock lock
+                    delete @locks[lock]
+            , 2000
+
+    # Remove given lock
+    removeLock: (lock) ->
+        delete @locks[lock]
+
+    # Wait that lock is bein free before running given function
+    runIfUnlock: (lock, callback) ->
+        handleCallback = =>
+            if @isLock lock
+                setTimeout handleCallback, 10
+            else
+                callback()
+        handleCallback()
+
+# Set locker as a global variable
+app.locker = new DataLock()


wait for images loaded before the initializing poplockit

--- components/feed/client/poplockit_feed.coffee
+++ components/feed/client/poplockit_feed.coffee
@@ -1,5 +1,6 @@
 _ = require 'underscore'
 FeedView = require('./feed.coffee')
+imagesLoaded = require 'imagesloaded'
 { isTouchDevice } = require '../../util/device.coffee'

 module.exports = class PoplockitFeed extends FeedView
@@ -19,7 +20,7 @@
     @$feedItems.removeClass 'unrendered-feed-item'
     @popLockItInitialized = true

-    _.defer =>
+    @$el.imagesLoaded =>
       @recomputeEachShowHeight()

   onResize: =>
@@ -55,7 +56,7 @@
     @createNewItems $unrenderedItems
     $unrenderedItems.removeClass 'unrendered-feed-item'

-    _.defer =>
+    @$el.imagesLoaded =>
       @recomputeEachShowHeight()

   createNewItems: ($items) ->


Don't run specs to avoid timing out the build

...this needs to be re-enabled on the next commit.

--- build/Gruntfile.coffee
+++ build/Gruntfile.coffee
@@ -288,7 +288,7 @@
   ciTasks.push('set-version', 'check-licenses', 'lint', 'generate-asar')
   ciTasks.push('mkdeb') if process.platform is 'linux'
   ciTasks.push('mktar') if process.platform is 'linux'
-  ciTasks.push('test') if process.platform is 'darwin'
+  # ciTasks.push('test') if process.platform is 'darwin'
   ciTasks.push('codesign:app') if process.platform is 'darwin' and not process.env.CI
   if process.platform is 'win32'
     ciTasks.push('codesign:exe') if process.env.JANKY_SIGNTOOL


Create largest-palindrome.coffee

Create largest-palindrome.coffee

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

--- largest-palindrome/largest-palindrome.coffee
+++ largest-palindrome/largest-palindrome.coffee
@@ -0,0 +1,15 @@
+largestPalindrome = (str) ->
+  palindromes = []
+  walkPalindrome = (result, str, leftIndex, rightIndex) ->
+    result = str[leftIndex -= 1] + result + str[rightIndex += 1]  while str[leftIndex - 1] is str[rightIndex + 1]
+    palindromes.push result
+  i = 0
+
+  while i < str.length
+    if str[i] is str[i - 1]
+      walkPalindrome str[i] + str[i - 1], str, i - 1, i
+    else if str[i] is str[i + 1]
+      walkPalindrome str[i] + str[i + 1], str, i, i + 1
+    else walkPalindrome str[i - 1] + str[i] + str[i + 1], str, i - 1, i + 1  if str[i - 1] is str[i + 1]
+    i++
+  palindromes.reduce ((memo, str) -> (if str.length > memo.length then str else memo)), ""


send action

send action

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


Updated Histrory collection to match new constants

--- SingularityUI/app/collections/History.coffee
+++ SingularityUI/app/collections/History.coffee
@@ -28,7 +28,7 @@

             requestUpdate.userHuman = requestUpdate.user
             requestUpdate.createdAtHuman = utils.humanTimeAgo requestUpdate.createdAt
-            requestUpdate.stateHuman = constants.requestStates[requestUpdate.state]
+            requestUpdate.stateHuman = constants.requestHistoryStates[requestUpdate.state]

         requestHistoryObjects


AddManagedVMModal: show KontrolUrl in instruction for dev and sandbox environments

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: remove obselete double quotes

client: remove obselete double quotes

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

--- client/app/lib/redux/services/payment.coffee
+++ client/app/lib/redux/services/payment.coffee
@@ -70,10 +70,10 @@
   { source, email } = params

   unless source?.token
-    throw new Error "invalid param: source. expected: { token: String }"
+    throw new Error 'invalid param: source. expected: { token: String }'

   unless email?
-    throw new Error "invaid param: email. expected: String"
+    throw new Error 'invaid param: email. expected: String'

   client.post Endpoints.CreditCardAuth, { source, email }


EditorPane: Remove unused variables.

EditorPane: Remove unused variables.

--- client/ide/workspace/panes/editorpane.coffee
+++ client/ide/workspace/panes/editorpane.coffee
@@ -7,17 +7,15 @@
     options.cssClass = KD.utils.curry 'editor-pane', options.cssClass
     options.paneType = 'editor'

-    {file} = options
-    @file  = file
+    {file}       = options
+    @file        = file
+    @lineWidgets = {}

     super options, data

     @hash  = file.paneHash  if file.paneHash

     @on 'SaveRequested', @bound 'save'
-
-    @lineWidgets = {}
-    @cursors     = {}

     @createEditor()

@@ -169,7 +167,6 @@
   setLineWidgets: (row, col, username) ->

     oldWidget      = @lineWidgets[username]
-    oldCursor      = @cursors[username]
     {renderer}     = @getEditor()
     widgetManager  = @getAce().lineWidgetManager
     lineHeight     = renderer.lineHeight


In 2014, we launched a Kickstarter campaign and Mathias Rabiot from the great Graphéine, a graphic design advice agency in Lyon, was one our wonderful backers! He sponsored this glyph. You can have a look at his work at http://www.grapheine.com/ Thank you Mathias!

add "commercial at" sign

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

--- src/glyphs/punctuation/arobase.coffee
+++ src/glyphs/punctuation/arobase.coffee
@@ -0,0 +1,160 @@
+# In 2014, we launched a Kickstarter campaign and Mathias Rabiot from the great Graphéine,
+# a graphic design advice agency in Lyon, was one our wonderful backers! He sponsored this glyph.
+# You can have a look at his work at http://www.grapheine.com/
+# Thank you Mathias!
+exports.glyphs['arobase'] =
+	unicode: '@'
+	glyphName: 'at'
+	characterName: 'COMMERCIAL AT'
+	ot:
+		advanceWidth: contours[0].nodes[4].expandedTo[1].x + spacingRight
+	transforms: Array(
+		['skewX', slant + 'deg']
+	)
+	parameters:
+		spacingLeft: 55 * spacing
+		spacingRight: 55 * spacing
+	tags: [
+		'all',
+		'latin',
+		'punctuation'
+	]
+	contours:
+		0:
+			skeleton: true
+			closed: false
+			nodes:
+				0:
+					x: contours[0].nodes[2].expandedTo[1].x + 700 + 300 * width - (7)
+					y: 0
+					dirOut: - 115 + 'deg'
+					expand: Object({
+						width: ( 30 / 90 ) * thickness
+						angle: 0 + 'deg'
+						distr: 0.25
+					})
+				1:
+					x: contours[0].nodes[2].expandedTo[0].x + ( contours[0].nodes[0].expandedTo[1].x - contours[0].nodes[2].expandedTo[0].x ) * 0.5
+					y: - 242
+					dirOut: 180 + 'deg'
+					type: 'smooth'
+					expand: Object({
+						width: ( 25 / 90 ) * thickness
+						angle: 180 + 90 + 'deg'
+						distr: 0.25
+					})
+				2:
+					x: spacingLeft + (53/90) * thickness
+					y: contours[0].nodes[1].y + ( contours[0].nodes[3].y - contours[0].nodes[1].y ) * 0.5
+					dirOut: 90 + 'deg'
+					expand: Object({
+						width: ( 70 / 90 ) * thickness
+						angle: 180 + 0 + 'deg'
+						distr: 0.25
+					})
+				3:
+					x: contours[0].nodes[2].x + ( contours[0].nodes[4].x - contours[0].nodes[2].x ) * 0.5
+					y: xHeight + 260
+					dirOut: 0 + 'deg'
+					expand: Object({
+						width: ( 25 / 90 ) * thickness
+						angle: 180 - 90 + 'deg'
+						distr: 0.25
+					})
+				4:
+					x: contours[0].nodes[0].x + (7)
+					y: ( 343 / 500 ) * xHeight
+					dirOut: - 90 + 'deg'
+					expand: Object({
+						width: ( 70 / 90 ) * thickness
+						angle: 0 + 'deg'
+						distr: 0.25
+					})
+				5:
+					x: contours[0].nodes[0].expandedTo[0].x + ( contours[0].nodes[1].expandedTo[0].x - contours[0].nodes[0].expandedTo[0].x ) * 0.38
+					x: contours[0].nodes[6].expandedTo[1].x + ( contours[0].nodes[4].expandedTo[0].x - contours[0].nodes[6].expandedTo[1].x ) * 0.5
+					y: 0
+					dirOut: 180 + 'deg'
+					type: 'smooth'
+					expand: Object({
+						width: ( 35 / 90 ) * thickness
+						angle: 180 + 62 + 'deg'
+						distr: 0.25
+					})
+				6:
+					x: contours[1].nodes[1].x + 80 * width + (21/90) * thickness
+					y: Math.max(
+						( 200 / 500 ) * xHeight,
+						200
+					)
+					dirIn: Utils.lineAngle( contours[0].nodes[6].point, contours[0].nodes[7].point )
+					typeOut: 'line'
+					expand: Object({
+						width: ( 85 / 90 ) * thickness
+						angle: 180 + 0 + 'deg'
+						distr: 0.75
+					})
+				7:
+					x: contours[0].nodes[6].x + 15 + Math.min( 55, ( 55 / 500 ) * xHeight )
+					y: ( 480 / 500 ) * xHeight
+					dirOut: 0 + 'deg'
+					expand: Object({
+						width: ( 85 / 90 ) * thickness
+						angle: 180 + 0 + 'deg'
+						distr: 0.75
+					})
+		1:
+			skeleton: true
+			closed: false
+			nodes:
+				4:
+					x: contours[0].nodes[6].expandedTo[1].x
+					y: contours[0].nodes[6].expandedTo[1].y
+					dirIn: Utils.lineAngle( contours[0].nodes[7].point, contours[0].nodes[6].point )
+					expand: Object({
+						width: ( 30 / 90 ) * thickness
+						angle: Math.PI + Utils.lineAngle( contours[0].nodes[6].point, contours[0].nodes[5].expandedTo[0].point )
+						distr: 1
+					})
+				3:
+					x: contours[1].nodes[2].expandedTo[0].x + ( contours[1].nodes[4].expandedTo[1].x - contours[1].nodes[2].expandedTo[0].x ) * 0.5
+					y: 20
+					dirOut: 0 + 'deg'
+					type: 'smooth'
+					expand: Object({
+						width: ( 68 / 90 ) * thickness
+						angle: 47 + 'deg'
+						distr: 0.25
+					})
+				2:
+					x: contours[1].nodes[1].x - 170 - 80 * width + (25/90) * thickness
+					y: contours[1].nodes[3].y + ( contours[1].nodes[0].y - contours[1].nodes[3].y ) * 0.55
+					dirOut: - 90 + 'deg'
+					type: 'smooth'
+					expand: Object({
+						width: ( 100 / 90 ) * thickness
+						angle: 10 + 'deg'
+						distr: 0.75
+					})
+				1:
+					x: contours[0].nodes[3].x + 5 * width
+					y: ( 490 / 500 ) * xHeight
+					dirOut: 180 + 'deg'
+					type: 'smooth'
+					expand: Object({
+						width: ( 25 / 90 ) * thickness
+						angle: - 95 + 'deg'
+						distr: 0
+					})
+				0:
+					x: Utils.onLine({
+						y: contours[0].nodes[7].y - ( 125 / 500 ) * xHeight
+						on: [ contours[0].nodes[6].expandedTo[1].point, contours[0].nodes[7].expandedTo[1].point ]
+					})
+					y: contours[0].nodes[7].y - ( 125 / 500 ) * xHeight
+					dirOut: 90 + 'deg'
+					expand: Object({
+						width: ( 20 / 90 ) * thickness
+						angle: 180 + 15 + 'deg'
+						distr: 1
+					})


Fix the cutted name in downloaded files

Fix the cutted name in downloaded files

--- lib/fileUpload.coffee
+++ lib/fileUpload.coffee
@@ -42,7 +42,7 @@
 				console.log arguments
 			onRead: (fileId, file, req, res) ->
 				unless file?.type?.match(/^image\/.*/)
-					res.setHeader 'content-disposition', "attachment; filename='#{ file.name }'"
+					res.setHeader 'content-disposition', "attachment; filename=\"#{ file.name }\""

 	if Meteor.isServer
 		initFileStore()


editor managers a pool of edit sessions

editor managers a pool of edit sessions

--- src/editor.coffee
+++ src/editor.coffee
@@ -6,6 +6,9 @@
 activeWindow = App.activeWindow

 ace = require 'ace/ace'
+
+{EditSession} = require 'ace/edit_session'
+{UndoManager} = require 'ace/undomanager'

 module.exports =
 class Editor extends Pane
@@ -30,6 +33,8 @@
     'Alt-Shift-.'     : 'end'
     'Ctrl-L'          : 'consolelog'

+  sessions: {}
+
   initialize: ->
     @ace = ace.edit "editor"
     @ace.setTheme require "ace/theme/twilight"
@@ -53,6 +58,7 @@
     return @saveAs() if not @filename

     File.write @filename, @ace.getSession().getValue()
+    @sessions[@filename] = @ace.getSession()
     activeWindow.setDirty false
     @ace._emit 'save', { @filename }

@@ -64,14 +70,15 @@
     if File.isDirectory @filename
       File.changeWorkingDirectory @filename
       activeWindow.setTitle _.last @filename.split '/'
-      @ace.getSession().setValue ""
+      @ace.setSession @newSession()
       activeWindow.setDirty false
     else
       if /png|jpe?g|gif/i.test @filename
         App.openURL @filename
       else
         activeWindow.setTitle _.last @filename.split '/'
-        @ace.getSession().setValue File.read @filename
+        @sessions[@filename] or= @newSession File.read @filename
+        @ace.setSession @sessions[@filename]
         activeWindow.setDirty false
     @ace._emit 'open', { @filename }

@@ -86,6 +93,11 @@
       @ace.focus()
       @ace.resize()
     , timeout
+
+  newSession: (code) ->
+    doc = new EditSession code or ''
+    doc.setUndoManager new UndoManager
+    doc

   copy: ->
     editor = @ace


Only add 'selection-line' decoration when marker is non-empty

--- src/editor.coffee
+++ src/editor.coffee
@@ -1245,7 +1245,7 @@
     cursor = new Cursor(editor: this, marker: marker)
     @cursors.push(cursor)
     @addDecorationForMarker(marker, type: ['gutter', 'line'], class: 'cursor-line', onlyHead: true)
-    @addDecorationForMarker(marker, type: ['gutter', 'line'], class: 'selected-line')
+    @addDecorationForMarker(marker, type: ['gutter', 'line'], class: 'selection-line', onlyNonEmpty: true)
     @emit 'cursor-added', cursor
     cursor


Update getLongTitle to be project relative

--- src/editor.coffee
+++ src/editor.coffee
@@ -259,7 +259,7 @@
   getLongTitle: ->
     if sessionPath = @getPath()
       fileName = path.basename(sessionPath)
-      directory = path.basename(path.dirname(sessionPath))
+      directory = atom.project.relativize(path.dirname(sessionPath))
       "#{fileName} - #{directory}"
     else
       'untitled'


A collection of "When you say..." tweets from @rands

error: pathspec 'src/scripts/rands-when-you-say.coffee' did not match any file(s) known to git

--- src/scripts/rands-when-you-say.coffee
+++ src/scripts/rands-when-you-say.coffee
@@ -0,0 +1,96 @@
+# Description
+#   A slightly incomplete collection of "When you say..." tweets from @rands
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot rands - A nugget of Randsian wisdom is dispensed
+#   hubot rands count - The number of wisdom nuggets is returned
+#
+# Notes:
+#   None
+#
+# Author:
+#   pberry
+
+module.exports = (robot) ->
+  wisdom = [
+    "Management works when you actually mean what you say. http://twitter.com/rands/statuses/11309449247",
+    "When you say \"unique leadership style,\" I hear \"jerk.\" https://twitter.com/rands/status/289893035150569472",
+    "When you say \"Not invented here,\" I hear \"It'd be more fun to build it.\" https://twitter.com/rands/status/214741618916466689",
+    "When you say \"Monetizing eyeballs,\" I hear \"We're going to stop building the stuff that matters.\" https://twitter.com/rands/status/217635293484945408",
+    "When you say “Detail oriented,” I hear “Gives a shit.” https://twitter.com/rands/status/220188892094152704",
+    "When you say \"I'll be the first to admit,\" I hear \"Everyone has been telling me I should admit this.\" https://twitter.com/rands/status/226375945521610753",
+    "When you say \"I trust your judgement,\" I hear \"I trust that you think you know better, but it will be entertaining to watch you fail.\" https://twitter.com/rands/status/235153466081808385",
+    "When you say \"I'm not suggesting,\" I hear \"I'm disguising my suggestions.\" https://twitter.com/rands/status/236987129513775104",
+    "When you say \"infrastructure play,\" I want to punch you. https://twitter.com/rands/status/237919382687334400",
+    "When you say \"Let's get on the same page,\" I hear, \"Let's get on my page.\" https://twitter.com/rands/status/243698273116889088",
+    "When you say \"Go forward plan,\" I hear \"It's more important to go forward than have a plan.\" https://twitter.com/rands/status/244821499880562688",
+    "When you say \"Build awareness,\" I hear \"Listen to me more.\" https://twitter.com/rands/status/245540962162593793",
+    "When you say \"Soon,\" I hear \"I don't know when.\" https://twitter.com/rands/status/247686950448943104",
+    "When you say \"It's really easy,\" I hear \"I wish it was really easy.\" https://twitter.com/rands/status/248565054948130817",
+    "When you say \"Normalize,\" I hear \"Improve legibility\" and then I sleep better at night. https://twitter.com/rands/status/252794850494267392",
+    "When you say \"Nothing is changing,\" I hear \"Yet.\" https://twitter.com/rands/status/253970014825218048",
+    "When you say \"A fundamental shift in business,\" I hear \"We'll be losing money for awhile\" : http://www.theverge.com/2012/10/9/3480696/steve-ballmer-shareholder-letter-2012-devices-services https://twitter.com/rands/status/255896683571978240",
+    "When you say “Conventional wisdom,” I hear “Path of least resistance.” https://twitter.com/rands/status/259162088503664640",
+    "When you say, “Falling through the cracks,” I hear “I don’t know why it’s breaking.” https://twitter.com/rands/status/261866058628091904",
+    "When you say \"Service event,\" I hear \"We are bullshitting you about the facts\" : http://t.co/LFzQFnOD https://twitter.com/rands/status/262089106551619585",
+    "When you say “Absolutely!” I hear “I am not fond of ambiguity.” https://twitter.com/rands/status/264393818214899712",
+    "When you say “We need to work on that,” I hear “Never.” https://twitter.com/rands/status/273951473157689344",
+    "When you say “Bespoke,” I can’t stop thinking about bicycles. https://twitter.com/rands/status/275841713367556096",
+    "When you say \"Quaint,\" I hear \"I can't be bothered to imagine that things could change.\" https://twitter.com/rands/status/280899714336038912",
+    "When you say \"Relaunch,\" I hear, \"The pivot isn't working.\" https://twitter.com/rands/status/281822856877322240",
+    "When you say \"Design-y\", I stop listening. https://twitter.com/rands/status/289485121361424384",
+    "When you say “It’s simple”, I hear “I don’t have to explain why it’s hard”. http://twitter.com/rands/statuses/28432698384",
+    "When you say “You suck”, I think “I win”. http://twitter.com/rands/statuses/6472192856",
+    "When you say “Thought leader”, I hear “You talk pretty”. http://twitter.com/rands/statuses/26584224990",
+    "When you say “Friendly reminder,” I hear “I will mess you up if you miss this deadline.” http://twitter.com/rands/statuses/202847708271230976",
+    "When you say “I trust your judgement,” I hear “I trust that you think you know better, but it will be entertaining to watch you fail.” http://twitter.com/rands/statuses/235153466081808385",
+    "When you say “It’s complicated,” I hear, “You aren’t going to like the answer.” http://twitter.com/rands/statuses/189203032905494529",
+    "When you say “Offsite”, I hear “Boondoggle”. http://twitter.com/rands/statuses/99521172005326848",
+    "When you say “Let’s send a message”, I hear “We don’t actually know what to say.” http://twitter.com/rands/statuses/139152607083102208",
+    "When you say “I’m a straight talker”, I hear “I don’t care that you don’t understand me”. http://twitter.com/rands/statuses/20333834621",
+    "When you say “Sure”, I don’t hear “Yes.” http://twitter.com/rands/statuses/133345216886345729",
+    "When you say “The facts are”, I hear “These are the facts I want you to know.” http://twitter.com/rands/statuses/156172596143063040",
+    "When you say “You hit the nail on the head”, I hear “I wish I thought of that.” http://twitter.com/rands/statuses/108597258055979008",
+    "When you say “He’s the real deal,” I think “What deal do you think I think he is?” http://twitter.com/rands/statuses/189049908639186944",
+    "When you say “Hang tough”, I hear “We have no better strategy than letting you stand there being punched”. http://twitter.com/rands/statuses/4345861202",
+    "When you say “A learning mindset”, I hear “I’m about to use big words that I don’t expect you to understand”. http://twitter.com/rands/statuses/21933940584",
+    "When you say “Executive Coach”, I hear “Expensive common sense”. http://twitter.com/rands/statuses/25998859249",
+    "When you say “Have to”, I hear “Don’t want to.” http://twitter.com/rands/statuses/131426938597277696",
+    "When you say “Iterate”, I try to hear “Working until it’s great” rather than “Working endlessly because you can’t describe done.” http://twitter.com/rands/statuses/158647734558138368",
+    "When you say “Technical debt,” I hear “We’ve been hacking.” http://twitter.com/rands/statuses/182492475724800001",
+    "When you say “We’ll cross that bridge when we get to it”, I hear “I agree this is my task, but I don’t care”. http://twitter.com/rands/statuses/56076748953092098",
+    "When you say “Thank god it’s Friday”, I hear “I hate my job”. http://twitter.com/rands/statuses/43792659864760320",
+    "When you say “Crowd-sourced”, I hear “We have no plan” : http://techcrunch.com/2011/04/01/color-updates-its-iphone-app-with-new-more-intelligible-icons-navigation/ http://twitter.com/rands/statuses/54290475783421952",
+    "When you say “Most people,” I hear “All the dumb people except me.” http://twitter.com/rands/statuses/152954436640182273",
+    "When you say “Hope” to an engineer, they hear “I have no credible plan”. http://twitter.com/rands/statuses/22001311155228674",
+    "When you say “We’re experiencing growing pains”, I hear “I didn’t think of that”. http://twitter.com/rands/statuses/53247126817345537",
+    "When you say “It is what it is”, I hear “I have totally given up”. http://twitter.com/rands/statuses/19513088389",
+    "When you say “Glaring blind spot”, I hear “Yeah, I didn’t see that coming, either”. http://twitter.com/rands/statuses/22581884963",
+    "When you say “All things being equal”, I hear “I’m confused why things aren’t equal.” http://twitter.com/rands/statuses/93400188479221760",
+    "When you say “Whatever”, I don’t hear much because I’m grinding my teeth with fury. http://twitter.com/rands/statuses/156260385010356224",
+    "When you say “Better is the enemy of done”, I hear “It’s ok to ship crap” http://twitter.com/rands/statuses/2793071211",
+    "When you say “Go Forward Plan” I hear “I picked a direction and called it forward” http://twitter.com/rands/statuses/14458189005",
+    "When you say “Perhaps it’s just me,” I hear “Yeah, everyone should think like I do.” http://twitter.com/rands/statuses/193155583938002944",
+    "When you say “The powers that be”, I hear “I have absolutely no authority in this matter”. http://twitter.com/rands/statuses/22031352673",
+    "When you say “a mix of personalities,” I hear “a couple of folks that drive me crazy.” http://twitter.com/rands/statuses/182113521876729856",
+    "When you say “I hate it”, I hear “I don’t have the time to actually have an opinion”. http://twitter.com/rands/statuses/24694739571",
+    "When you say “organizational efficiency expert”, I hear “ABHJKJDHhuASDKJH BHS SAD SAHJJHASDJH NAHJASDHAJS” (sfx: my head hitting keyboard) http://twitter.com/rands/statuses/26384939022",
+    "When you say “It’s an imprecise science”, I hear “I am fully making this up as I go.” http://twitter.com/rands/statuses/159808299779358720",
+    "When you say “Let’s cut through the bullshit”, I hear “You‘re not telling me what I want to hear”. http://twitter.com/rands/statuses/11876666225725440",
+    "When you say “I don’t care”, I often hear “I don’t want to deal with the consequences of deciding”. http://twitter.com/rands/statuses/19799390667415552",
+    "When you say “Cost Effective”, I hear “I’m too busy to understand value in any other terms than money.” http://twitter.com/rands/statuses/132114748086030337",
+    "When you say, “You‘re the boss” I hear “We got together and all agree that you‘re about to screw this up” http://twitter.com/rands/statuses/6090022746",
+    "When you say “It wasn’t meant to happen”, I hear “We don’t know or can’t explain how we screwed up.” http://twitter.com/rands/statuses/144102532220858368",
+    "When you say “The last thing I want to happen is”, I hear “This is what I expect to occur”. http://twitter.com/rands/statuses/83340096601993216",
+    "When you say “Well, you‘re lucky that..”, I hear “Well, I have absolutely no control or influence over this situation”. http://twitter.com/rands/statuses/52036340375764992"
+  ]
+  robot.respond /rands$/i, (msg) ->
+    msg.send msg.random wisdom
+  robot.respond /rands count$/i, (msg) ->
+    msg.send("I currently have #{wisdom.length} Randisms in my database.")


Add timeout detection for TERA client

Add timeout detection for TERA client

remote: Repository unavailable due to DMCA takedown.
remote: See the takedown notice for more details:
remote:   https://github.com/github/dmca/blob/master/2018/2018-09-28-TeraPC.md.
fatal: unable to access 'https://github.com/meishuu/tera-discord-relay.git/': The requested URL returned error: 403


Tests

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/clochix/cozy-ical.git/'


client: remove isusergroupadmin util

client: remove isusergroupadmin util

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


IDE: TabView: make sure frontApp is IDE

IDE: TabView: make sure frontApp is IDE

--- client/ide/lib/views/tabview/ideview.coffee
+++ client/ide/lib/views/tabview/ideview.coffee
@@ -77,8 +77,8 @@
     @tabView.on 'PaneDidShow', =>
       { frontApp } = kd.singletons.appManager
       @updateStatusBar()
-      frontApp.writeSnapshot()
-      @focusTab()  if frontApp.isTabViewFocused @tabView
+      frontApp?.writeSnapshot?()
+      @focusTab()  if frontApp?.isTabViewFocused @tabView

     @tabView.on 'PaneAdded', (pane) =>
       pane.tabHandle.setClass 'focus'


StackEditor: handle bootstrap correctly

StackEditor: handle bootstrap correctly

--- client/stack-editor/lib/editor/index.coffee
+++ client/stack-editor/lib/editor/index.coffee
@@ -659,7 +659,7 @@

     req                   = { stackTemplateId: stackTemplate._id }
     selectedProvider      = @getOption 'selectedProvider'
-    req.provider          = selectedProvider  if selectedProvider is 'vagrant'
+    req.provider          = selectedProvider

     computeController.getKloud()
       .checkTemplate req
@@ -667,12 +667,12 @@

         console.log '[KLOUD:checkTemplate]', err, response

-        if err or not response
+        if err or not response.machines?.length
           @outputView
             .add 'Something went wrong with the template:'
             .add err?.message or 'No response from Kloud'

-          callback err
+          callback err ? { message: 'No respoonse from Kloud' }

         else


avoid redirects on api call

avoid redirects on api call

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


Teamwork: Added FacebookTeamwork class.

Teamwork: Added FacebookTeamwork class.


Add comment regarding .blur() on embeds.

Including embeds for .blur() etc. here is experimental.  It appears to
be the right thing to do for most common use cases.  However, it could
also cripple flash-based sites and games.  See discussion in #1211
and #1194.

--- content_scripts/vimium_frontend.coffee
+++ content_scripts/vimium_frontend.coffee
@@ -458,6 +458,9 @@
     if isEditable(event.srcElement) or isEmbed(event.srcElement)
       # Remove focus so the user can't just get himself back into insert mode by typing in the same input
       # box.
+      # NOTE(smblott, 2014/12/22) Including embeds for .blur() etc. here is experimental.  It appears to be
+      # the right thing to do for most common use cases.  However, it could also cripple flash-based sites and
+      # games.  See discussion in #1211 and #1194.
       event.srcElement.blur()
     exitInsertMode()
     DomUtils.suppressEvent event


FlexSplit: FlexResizer initial commit

FlexSplit: FlexResizer initial commit

error: pathspec 'lib/components/flexsplit/flexresizer.coffee' did not match any file(s) known to git

--- lib/components/flexsplit/flexresizer.coffee
+++ lib/components/flexsplit/flexresizer.coffee
@@ -0,0 +1,187 @@
+KDFlex = require './flex'
+KDView = require '../../core/view'
+
+
+module.exports = class KDFlexSplitResizer extends KDView
+
+
+  constructor: (options = {}, data) ->
+
+    options.type     ?= KDFlex.HORIZONTAL
+    options.cssClass  = 'flex-resizer'
+    options.draggable = { axis: options.type.axis }
+
+    super options, data
+
+    @views      = []
+    @_fractions = []
+    { @type, view } = @getOptions()
+
+    @addView view
+
+    @on 'DragFinished', @dragFinished
+    @on 'DragStarted',  @dragStarted
+
+
+  _getViewIndex: (view) ->
+    if view is @views[0] then 0 else 1
+
+
+  addView: (view) ->
+
+    @views.push view
+
+    # This will handle expand request of the view, it will set fraction
+    # as KDFlex.MAX for requested view and will do KDFlex.MIN for other view
+    # it will also fire the same event which will cause a chain reaction
+    # on parent resizers to do same. It will allow us to expand nested
+    # views up to the parent one ~ GG
+    view.on KDFlex.EVENT_EXPAND, =>
+
+      return  if view.hasClass 'expanded'
+      view.setClass 'expanded'
+
+      # This will start chain reaction for expanding parent views
+      @emit KDFlex.EVENT_EXPAND
+
+      @_updateViewSizes()
+      @_updateFractions 0, set = no
+
+      fractions = []
+      viewIndex = @_getViewIndex view
+      for i in [0..1]
+        fractions.push if i is viewIndex then KDFlex.MAX else KDFlex.MIN
+        @_setViewFraction @views[i], fractions[i]
+
+      @emit KDFlex.EVENT_EXPANDED, fractions
+      view._windowDidResize?()
+
+    # This will handle collapse request of the view, it will set fraction
+    # as KDFlex.MIN for requested view and will do KDFlex.MAX for other view
+    # it will also fire the same event which will cause a chain reaction
+    # on parent resizers to do same. It will allow us to collapse nested
+    # views up to the parent one ~ GG
+    view.on KDFlex.EVENT_COLLAPSE, =>
+
+      # This will start chain reaction for collapsing parent views
+      @emit KDFlex.EVENT_COLLAPSE
+
+      fractions = []
+      viewIndex = @_getViewIndex view
+      for i in [0..1]
+        fractions.push @_fractions[i] ? 50
+        @_setViewFraction @views[i], fractions[i]
+        @views[i].unsetClass 'expanded'
+
+      @emit KDFlex.EVENT_COLLAPSED, fractions
+      view._windowDidResize?()
+
+
+    view.on KDFlex.EVENT_HIDE, =>
+
+      fractions = [Flex.MAX, KDFlex.MAX]
+      viewIndex = @_getViewIndex view
+      fractions[viewIndex] = KDFlex.MIN
+
+      for i in [0..1]
+        @_setViewFraction @views[i], fractions[i]
+
+      @emit KDFlex.EVENT_HIDDEN, fractions
+      view._windowDidResize?()
+
+    # Custom Resize events for programatically resize the view based on the
+    # given percentage, the other side will be resized to KDFlex.MAX -
+    # Triggering storage is optional and disabled by default ~ GG
+    view.on KDFlex.EVENT_RESIZE, (options) =>
+
+      { percentage = KDFlex.MIN, store = no } = options
+
+      leftOver  = KDFlex.MAX - percentage
+      fractions = [leftOver, leftOver]
+      viewIndex = @_getViewIndex view
+      fractions[viewIndex] = percentage
+
+      for i in [0..1]
+        @_setViewFraction @views[i], fractions[i]
+
+      if store
+        @emit KDFlex.EVENT_RESIZED, fractions
+
+      view._windowDidResize?()
+
+
+  _updateViewSizes: ->
+    # This will get height or width of given views. This height or width
+    # depends on the type of this KDFlexSplitResizer. For example; if we've
+    # a horizontal resizer then getter will be `getHeight` look constants.
+    @sizes = [
+      @views[0][@type.getter]()
+      @views[1][@type.getter]()
+    ]
+
+    # We need to know totalSize of the view including resizer's width or height
+    # Since we are not defining resizer handle size in code but in style we
+    # need to calculate that size dynamically as well
+    #
+    # This totalSize will become total width or total height of the KDFlexSplit
+    @totalSize = @sizes[0] + @sizes[1] + @[@type.getter]()
+
+
+  limited = (num) ->
+    Math.min KDFlex.MAX, Math.max KDFlex.MIN, num
+
+
+  _updateFractions: (change = 0, set = yes) ->
+    # This will calculate fractions for each view and will leave enough space
+    # for the resizer itself as well. For example on a 100px wide KDFlexSplit
+    # if you have a 4px wide resizer 96px will be distributed on the views.
+    # If they splitted even on the screen then their fractions will become
+    # 48% and 48%, remaining 4% is used by the resizer itself. ~ GG
+    for i in [0..1]
+      change = -change  if i is 1
+      @_fractions[i] = limited ((change + @sizes[i]) / @totalSize) * KDFlex.MAX
+      @_setViewFraction @views[i], @_fractions[i]  if set
+
+
+  drag: (event, delta) ->
+    # on drag we are getting the delta based on the axis of this type
+    # of resizer x for VERTICAL, y for HORIZONTAL ptl. constants.
+    @_updateFractions delta[@type.axis]
+
+
+  dragFinished: (event, dragState) ->
+
+    @unsetClass 'ondrag'
+    @emit KDFlex.EVENT_RESIZED, @_fractions
+    for view in @views
+      view.unsetClass 'ondrag'
+      view._windowDidResize?()
+
+
+  dragStarted: (event, dragState) ->
+
+    for view in @views
+      view.unsetClass 'expanded'
+      view.setClass 'ondrag'
+
+    @setClass 'ondrag'
+
+    @_updateViewSizes()
+
+
+  setFractions: (fractions, options = {}) ->
+
+    { updateViews = yes, initialFractions = [50, 50] } = options
+
+    @_fractions = initialFractions
+    return  unless updateViews
+
+    for index in [0..1]
+      @_setViewFraction @views[index], fractions[index]
+      if fractions[index] is KDFlex.MAX
+        @views[index].setClass 'expanded'
+
+
+  _setViewFraction: (view, fraction) ->
+    view.setCss 'flex-basis', "#{fraction}%"
+    view._windowDidResize?()


added krona/_base/dom for simplify DOM manipulation

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


add CommonBase class

add CommonBase class

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

--- lib/common_base.coffee
+++ lib/common_base.coffee
@@ -0,0 +1,48 @@
+# Base class with a few common OO methods
+class CommonBase
+  # Defines a new property with getter and setter
+  #
+  # @param [String] name The property's name
+  # @param [Object] def An object describing the property.
+  #   See the defineProperty documentation for details
+  #
+  # @example
+  #   class MyClass
+  #     @property 'MyProperty',
+  #       get: -> @__my_property,
+  #       set: (value) ->
+  #         console.log("writing MyProperty")
+  #         @__my_property = value
+  @property : (name, def) ->
+    Object.defineProperty @prototype, name, def
+
+  # Defines a new option, a property that is stored in a "options" object
+  #
+  # @param [String] option The option's name
+  # @param [String,Number,Boolean,Object,Array] defaultValue The option's default value
+  #
+  # @example
+  #   class MyClass
+  #     @option 'enabled', true
+  @option : (option, defaultValue) ->
+    @property option,
+      get: -> @options?[option] ? defaultValue,
+      set: (value) ->
+        @options ?= {}
+        [old, @options[option]] = [@[option], value]
+        @onOptionChanged?(option, old, value) unless old == value
+
+  # Defines a new "on<Event>" option
+  #
+  # @param [String] name The event's name
+  @event : (name) ->
+    @option "on#{name[0].toUpperCase()}#{name[1..]}"
+
+  # @private
+  @__instance_counter__ : 0
+
+  # @property [Integer] Instance number for this class
+  @property '__instance_number__',
+    get: -> @__instance_index__ ?= @constructor.__instance_counter__++
+
+exports.CommonBase = CommonBase


checking length variable

checking length variable

--- server/konnectors/twitter.coffee
+++ server/konnectors/twitter.coffee
@@ -75,7 +75,7 @@
     params = descending: true

     TwitterTweet.request 'byDate', params, (err, tweets) =>
-        if tweets.length > 0
+        if tweets.length? and tweets.length > 0
             start = moment(tweets[0].date)
         else
             start = moment().subtract('years', 10)


Fix for proxying

Fix for proxying

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/skgcorp/freshdesk-workflows.git/'


Client: Activity: Added actionTypes for channel notification settings flux

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

--- client/activity/lib/flux/channelnotificationsettings/actions/actiontypes.coffee
+++ client/activity/lib/flux/channelnotificationsettings/actions/actiontypes.coffee
@@ -0,0 +1,19 @@
+module.exports = {
+
+  'LOAD_GLOBAL_NOTIFICATION_SETTINGS_FAIL'
+  'LOAD_GLOBAL_NOTIFICATION_SETTINGS_SUCCESS'
+
+  'LOAD_CHANNEL_NOTIFICATION_SETTINGS_FAIL'
+  'LOAD_CHANNEL_NOTIFICATION_SETTINGS_SUCCESS'
+
+  'CREATE_CHANNEL_NOTIFICATION_SETTINGS_FAIL'
+  'CREATE_CHANNEL_NOTIFICATION_SETTINGS_SUCCESS'
+
+  'UPDATE_CHANNEL_NOTIFICATION_SETTINGS_FAIL'
+  'UPDATE_CHANNEL_NOTIFICATION_SETTINGS_SUCCESS'
+
+  'DELETE_CHANNEL_NOTIFICATION_SETTINGS_FAIL'
+  'DELETE_CHANNEL_NOTIFICATION_SETTINGS_SUCCESS'
+
+}
+


Initial SimpleMVC checkin.

Initial SimpleMVC checkin.

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

--- src/main/coffee/SimpleMVC.coffee
+++ src/main/coffee/SimpleMVC.coffee
@@ -0,0 +1,72 @@
+class SimpleMVC.Event
+    ensureInitialized: (name) ->
+        this.eventHandlers = [] if !this.eventHandlers?
+        this.eventHandlers[name] = [] if !this.eventHandlers[name]?
+
+    registerEvent: (name, fn) ->
+        this.ensureInitialized(name)
+        this.eventHandlers[name].push(fn)
+
+    unregisterEvent: (name, fn) ->
+        this.ensureInitialized(name)
+        index = this.eventHandlers[name].indexOf(fn)
+        this.eventHandlers[name].splice(index, 1) if index >= 0
+
+    unregisterAllEvents: (name) ->
+        this.eventHandlers = [] if !name?
+        this.eventHandlers[name] = []
+
+    triggerEvent: (name, args...) ->
+        this.ensureInitialized(name)
+        fn.apply(this, args) for fn in this.eventHandlers[name]
+
+class SimpleMVC.Model extends SimpleMVC.Event
+    constructor: () ->
+        this._props = {}
+
+    @defineGetterSetter: (name) ->
+        Object.defineProperty(this.prototype, name, {
+            get: () -> this._props[name],
+            set: (val) ->
+                this._props[name] = val
+                this.triggerEvent("change:" + name, val)
+                this.triggerEvent("change", this)
+        })
+
+    @fields: (names...) ->
+        @defineGetterSetter(name) for name in names
+
+class SimpleMVC.Controller extends SimpleMVC.Event
+    constructor: () -> this.routes = []
+
+    @escapeRegex: (rgx) -> rgx.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
+
+    @urlBase: (base = "/") -> this.baseUrl = @escapeRegex(base)
+
+    @route: (path, fn) ->
+        # Convert to regexp before inserting into routes list.
+        # First, escape regexp characters, then replace :[A-Za-z] with ([^/]+)
+        # for :name entries.
+        escapedPath = @escapeRegex(path)
+        escapedPath = escapedPath.replace(/:[A-Za-z]/, "([^/]+)")
+        this.routes[new RegExp(escapedPath)] = fn
+
+    @urlBase "/"
+
+    addNewState: (uri) ->
+        if history.pushState?
+            history.pushState(null, "", uri)
+        else
+            urlWithoutBase = location.href.replace(/#.*/, "")
+            location.replace(urlWithoutBase + "#" + uri)
+        this.triggerEvent("navigated", uri)
+
+    navigate: (uri, callRouteFn) =>
+        uri = @escapeRegex uri.replace(new RegExp("^" + this.baseUrl), "")
+        exists = this.routes.some((r) ->
+            v = r.exec uri
+            ret = false
+            ret = this.routes[r].apply(this, v.slice(1)) if v? && callRouteFn
+            ret || (v? && !callRouteFn))
+        this.addNewState(uri) if exists
+        exists


Added atom packages file

Added atom packages file

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

--- atom/packages.cson
+++ atom/packages.cson
@@ -0,0 +1,24 @@
+packages: [
+  "build"
+  "busy"
+  "file-icons"
+  "git-blame"
+  "git-log"
+  "git-plus"
+  "git-time-machine"
+  "hex"
+  "highlight-line"
+  "highlight-selected"
+  "keyboard-localization"
+  "linter"
+  "linter-gcc"
+  "merge-conflicts"
+  "minimap"
+  "minimap-bookmarks"
+  "package-sync"
+  "project-manager"
+  "todo-show"
+  "tool-bar"
+  "tool-bar-main"
+  "toolbar-iconshortcuts"
+]


atom: add a couple of rust snippets

atom: add a couple of rust snippets

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/suyash-new/dotfiles.git/'


Update core/Objects with hash implementation

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/MicrosmartSA/ubiquity-ui.git/'


add web.coffee, filter ip and port

add web.coffee, filter ip and port

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

--- port_scan/coffee/web.coffee
+++ port_scan/coffee/web.coffee
@@ -0,0 +1,78 @@
+##web.coffee
+mongojs = require 'mongojs'
+express = require 'express'
+EventProxy = require 'eventproxy'
+db = mongojs 'test', ['ips']
+app = express()
+
+ip2num = (ipstr) ->
+  ip = 0
+  ipdot = ipstr.split('.').reverse()
+  ipis = ipdot.map (v, i) ->
+          return v * Math.pow(256, i)
+  ipis.forEach (v,i) -> return ip+=v
+  return ip
+
+num2ip = (ipnum) ->
+  ipis = [0,0,0,0]
+  ipdots = ipis.map (v, i) ->
+    n = Math.pow(256, 3-i)
+    ipdot = parseInt(ipnum / n)
+    ipnum = ipnum % n
+    return ipdot
+  return ipdots.join('.')
+
+app.get '/result', (req, res) ->
+  body = {}
+  body['ips']=[]
+  db.ips.find({},{'_id': false}).forEach (err, doc) ->
+    if err then throw err
+    if doc
+      body['ips'].push doc
+    else
+      res.end(JSON.stringify body, null, 2)
+  res.setHeader('Content-Type', 'application/json')
+
+app.get '/fip/:from-:to', (req, res) ->
+  ep = new EventProxy()
+  ep.after 'one_ip', [ip2num(req.params.from)..ip2num(req.params.to)].length, ->
+    res.end(JSON.stringify body, null, 2)
+  res.setHeader('Content-Type', 'application/json')
+  body = {}
+  body['data'] = {}
+  db.ips.find({'ip': {$in: num2ip(i) for i in [ip2num(req.params.from)..ip2num(req.params.to) ]}},{'_id': false}).forEach (err, doc) ->
+    if err then throw err
+    if doc
+      body['data'][doc.ip] = doc.port
+    ep.emit 'one_ip'
+
+app.get '/fport/:from-:to', (req, res) ->
+  ep = new EventProxy()
+  ep.after 'one_port', [Number(req.params.from)..Number(req.params.to)].length, ->
+    res.end(JSON.stringify body, null, 2)
+  res.setHeader('Content-Type', 'application/json')
+  body = {}
+  body['data'] = {}
+  for i in [Number(req.params.from)..Number(req.params.to)]
+    do (i) ->
+      db.ips.find {'port': {$all: [i]}}, {'_id': false, 'port': false, 'update': false}, (err, docs) ->
+        if err then throw err
+        if docs.length != 0
+          body['data'][i] = (j['ip'] for j in docs)
+        ep.emit 'one_port'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+app.listen(3000)
+


add more giphy

add more giphy

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


Fix discussion js test #5

Fix discussion js test #5

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/nttks/jenkins-test.git/'


Added sorting by relativePath for render scripts

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/pflannery/docpad-plugin-cmds.git/'


Add close event listener for icecast source to allow proper failover

--- src/streammachine/sources/icecast.coffee
+++ src/streammachine/sources/icecast.coffee
@@ -72,7 +72,6 @@
                     @_chunk_queue_ts = (new Date)

                     # emit new buffer
-                    @log.debug "emit with #{buf.length}"
                     @emit "data", buf
                     #@emit "data", { data:buf, ts:buf_ts }

@@ -91,8 +90,15 @@

             @last_header = data
             @emit "header", data, header
+
+        @req.on "close", =>
+            @connected = false
+            @log.debug "Icecast source got close event"
+            @emit "disconnect"
+            @res.end()

         @req.on "end", =>
+            @connected = false
             @log.debug "Icecast source got end event"
             # source has gone away
             @emit "disconnect"


added more jargon

added more jargon

--- src/businesscat.coffee
+++ src/businesscat.coffee
@@ -54,6 +54,7 @@
   'hit the ground running',
   'hold the fort',
   'key takeaways',
+  'leverage',
   'low hanging fruit',
   'make hay',
   'move the goal posts',


De-lint.

De-lint.

--- src/text-editor.coffee
+++ src/text-editor.coffee
@@ -127,7 +127,7 @@

     buffer ?= new TextBuffer
     @displayBuffer ?= new DisplayBuffer({
-      buffer, tabLength, softWrapped, ignoreInvisibles: @mini or !showInvisibles, largeFileMode,
+      buffer, tabLength, softWrapped, ignoreInvisibles: @mini or not showInvisibles, largeFileMode,
       @config, @assert, @grammarRegistry, @packageManager
     })
     @buffer = @displayBuffer.buffer


fix error display

fix error display

--- client/app/views/konnector.coffee
+++ client/app/views/konnector.coffee
@@ -27,7 +27,7 @@
         @$el.addClass "konnector-#{slug}"
         @updateImportWidget()

-        if not @model.get('errorMessage')? or @model.get 'isImporting'
+        if not @model.get('importErrorMessage')? or @model.get 'isImporting'
             @hideErrors()

         for name, val of @model.get 'fields'
@@ -127,10 +127,10 @@
                 success: (model, success) ->
                     # Success is handled via the realtime engine.
                 error: (model, err) =>
-                    # cozycloud.cc timeout is not considered like an error
                     if err.status >= 400 and err.status isnt 504
                         try
                             @showErrors t JSON.parse(err.responseText).message
+                    # cozycloud.cc timeout is not considered like an error
                         catch
                             @showErrors t "import server error"


Disable Chosen on iOS devices (iPad, iPod, iPhone)

--- coffee/lib/abstract-chosen.coffee
+++ coffee/lib/abstract-chosen.coffee
@@ -202,6 +202,8 @@
   @browser_is_supported: ->
     if window.navigator.appName == "Microsoft Internet Explorer"
       return null isnt document.documentMode >= 8
+    if /iP(ad|od|hone)/.test(window.navigator.userAgent)
+      return false
     return true

   @default_multiple_text: "Select Some Options"


Externalized hardcoded labels into overridable AbstractChosen static fields

--- coffee/lib/abstract-chosen.coffee
+++ coffee/lib/abstract-chosen.coffee
@@ -5,6 +5,10 @@
 root = this

 class AbstractChosen
+
+  @default_multiple_text: "Select Some Options"
+  @default_single_text: "Select an Option"
+  @default_no_result_text: "No results match"

   constructor: (@form_field, @options={}) ->
     this.set_default_values()
@@ -38,11 +42,11 @@
     if @form_field.getAttribute("data-placeholder")
       @default_text = @form_field.getAttribute("data-placeholder")
     else if @is_multiple
-      @default_text = @options.placeholder_text_multiple || @options.placeholder_text || "Select Some Options"
+      @default_text = @options.placeholder_text_multiple || @options.placeholder_text || AbstractChosen.default_multiple_text
     else
-      @default_text = @options.placeholder_text_single || @options.placeholder_text || "Select an Option"
+      @default_text = @options.placeholder_text_single || @options.placeholder_text || AbstractChosen.default_single_text

-    @results_none_found = @form_field.getAttribute("data-no_results_text") || @options.no_results_text || "No results match"
+    @results_none_found = @form_field.getAttribute("data-no_results_text") || @options.no_results_text || AbstractChosen.default_no_result_text

   mouse_enter: -> @mouse_on_container = true
   mouse_leave: -> @mouse_on_container = false


hubot script to pull random images from pinterest.com

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

--- src/scripts/pin.coffee
+++ src/scripts/pin.coffee
@@ -0,0 +1,38 @@
+# Description:
+#   Returns a random image from pinterest
+#
+# Dependencies:
+#   "htmlparser": "1.7.6"
+#   "soupselect: "0.2.0"
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot pin|pinterest me <query> - Returns a random image from pinterest for <query>
+#
+# Author:
+#   rasyidmujahid
+
+select      = require("soupselect").select
+htmlparser  = require("htmlparser")
+
+module.exports = (robot) ->
+  robot.respond /(pin|pinterest)( me)? (.*)/i, (msg) ->
+    pin_me msg, msg.match[3], (url) ->
+      msg.send url
+
+pin_me = (msg, query, cb) ->
+  msg.http('http://pinterest.com/search/pins/?')
+    .query(q: query)
+    .get() (err, res, body) ->
+      cb get_img_src(body, "img.PinImageImg")
+
+get_img_src = (body, selector)->
+  html_handler  = new htmlparser.DefaultHandler((()->), ignoreWhitespace: true )
+  html_parser   = new htmlparser.Parser html_handler
+
+  html_parser.parseComplete body
+  imgs = select(html_handler.dom, selector)
+  idx = Math.floor(Math.random() * imgs.length)
+  imgs[idx].attribs.src


custom logging test

custom logging test

error: pathspec 'test/custom-log.coffee' did not match any file(s) known to git

--- test/custom-log.coffee
+++ test/custom-log.coffee
@@ -0,0 +1,25 @@
+mm = require '../src/mongodb-migrations'
+testsCommon = require './common'
+
+describe 'Migrator', ->
+  it 'should allow custom logging', (done) ->
+    messages = []
+    log = (level, message) ->
+      if level == 'user'
+        messages.push message
+
+    migrator = new mm.Migrator testsCommon.config, log
+
+    migrator.add
+      id: '1'
+      up: (cb) ->
+        this.log '1'
+        this.log '2'
+        cb()
+    migrator.migrate (err, res) ->
+      return done(err) if err
+      res['1'].should.be.ok
+      messages.should.have.lengthOf 2
+      messages[0].should.be.equal '1'
+      messages[1].should.be.equal '2'
+      done()


This spec doesnt rely on the template

This spec doesnt rely on the template

--- apps/partnerships/test/client/view.coffee
+++ apps/partnerships/test/client/view.coffee
@@ -3,19 +3,13 @@
 rewire = require 'rewire'
 sinon = require 'sinon'
 Backbone = require 'backbone'
-{ resolve } = require 'path'

 describe 'PartnershipsView', ->
   before (done) ->
-    benv.setup =>
-      benv.expose
-        $: benv.require 'jquery'
-        crop: sinon.stub()
+    benv.setup ->
+      benv.expose $: benv.require 'jquery'
       Backbone.$ = $
-      $.fn.waypoint = sinon.stub()
-      data = _.extend require('../fixture/content.json'), sd: {}, asset: (->)
-      benv.render resolve(__dirname, '../../templates/index.jade'), data, =>
-        done()
+      done()

   after ->
     benv.teardown()


Fix url regex by adding missing valid chars for hash/fragments


add local provider

add local provider

error: pathspec 'src/left-menu-clock/provider-local.coffee' did not match any file(s) known to git

--- src/left-menu-clock/provider-local.coffee
+++ src/left-menu-clock/provider-local.coffee
@@ -0,0 +1,4 @@
+module.exports =
+  init: ->
+  getTime: ->
+    new Date()


fix (data/session) Remove debuglogging of a variable that does not 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/AppGyver/supersonic.git/'


[codegen] list|head:tail| and list|len| syntax in cond

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


Turn off debug

Turn off 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/freyproject/frey.git/'


+ [test] formatName(case-insensitive) test

error: pathspec 'test/case-insensitive-factory-test.coffee' did not match any file(s) known to git

--- test/case-insensitive-factory-test.coffee
+++ test/case-insensitive-factory-test.coffee
@@ -0,0 +1,290 @@
+inherits        = require 'inherits-ex/lib/inherits'
+chai            = require 'chai'
+sinon           = require 'sinon'
+sinonChai       = require 'sinon-chai'
+should          = chai.should()
+expect          = chai.expect
+chai.use(sinonChai)
+
+createCtor      = require 'inherits-ex/lib/createCtor'
+factory         = require '../src/custom-factory'
+setImmediate    = setImmediate || process.nextTick
+
+
+class Codec
+  factory Codec
+
+  @formatName: (aName)->aName.toLowerCase()
+  constructor: -> return super
+  initialize: (aOptions)->
+    if 'number' is typeof aOptions
+      @bufferSize = aOptions
+    else if aOptions
+      @bufferSize = aOptions.bufSize
+
+
+testCodecInstance = (obj, expectedClass, bufSize)->
+  should.exist obj, "testCodecInstance:" + expectedClass.name
+  obj.should.be.instanceOf expectedClass
+  obj.should.be.instanceOf Codec
+  if bufSize > 0
+    obj.should.have.property 'bufferSize', bufSize
+getClass = (aName, expectedClass, bufSize)->
+  aName = aName.toLowerCase()
+  My = Codec[aName]
+  should.exist My, "My"
+  My.should.be.equal expectedClass
+  opt = bufSize:bufSize if bufSize?
+  my = My opt
+  testCodecInstance my, expectedClass, bufSize
+  my.should.be.equal Codec(aName)
+  My
+describe "CaseInsensitive Factory", ->
+    #before (done)->
+    #after (done)->
+    register  = Codec.register
+    aliases   = Codec.aliases
+    unregister= Codec.unregister
+
+    class MyNewCodec
+      register(MyNewCodec).should.be.ok
+      constructor: Codec
+    class MyBufferCodec
+      register(MyBufferCodec).should.be.ok
+      constructor: Codec
+    class MyNewSubCodec
+      register(MyNewSubCodec, MyNewCodec).should.be.ok
+      constructor: -> return super
+    class MyNewSub1Codec
+      register(MyNewSub1Codec, MyNewSubCodec).should.be.ok
+      constructor: Codec
+    it "should have register instance method", ->
+      myCodec = Codec('MyNew')
+      testCodecInstance myCodec, MyNewCodec
+      myCodec.should.have.property 'register'
+    it "should have unregister instance method", ->
+      myCodec = Codec('MyNew')
+      testCodecInstance myCodec, MyNewCodec
+      myCodec.should.have.property 'unregister'
+    it "should have registered instance method", ->
+      myCodec = Codec('MyNew')
+      testCodecInstance myCodec, MyNewCodec
+      myCodec.should.have.property 'registered'
+    it "should have registeredClass instance method", ->
+      myCodec = Codec('MyNew')
+      testCodecInstance myCodec, MyNewCodec
+      myCodec.should.have.property 'registeredClass'
+    describe "Class(Static) Methods", ->
+      describe ".register", ->
+        it "should register a new Codec Class with default.", ->
+          myCodec = Codec('MyNew')
+          testCodecInstance myCodec, MyNewCodec
+        it "should register a new Codec Class with parent Codec Class.", ->
+          myCodec = Codec('MyNewSub')
+          should.exist myCodec, "MyNewSub instance"
+          myCodec.should.be.instanceOf MyNewSubCodec
+          myCodec.should.be.instanceOf MyNewCodec
+          myCodec.should.be.instanceOf Codec
+          MyCodec = getClass 'MyNew', MyNewCodec
+          MyCodec.should.have.property 'MyNewSub'.toLowerCase(), MyNewSubCodec
+        it "should get an instance via the child Codec class directly.", ->
+          myCodec = Codec('MyNewSub1')
+          should.exist myCodec, "MyNewSub1Codec instance"
+          myCodec.should.be.instanceOf MyNewSub1Codec
+          myCodec.should.be.instanceOf MyNewSubCodec
+          myCodec.should.be.instanceOf MyNewCodec
+          myCodec.should.be.instanceOf Codec
+          my = MyNewSub1Codec bufSize:123456
+          testCodecInstance my, MyNewSub1Codec, 123456
+          my.should.be.equal myCodec
+        it "should register a new Codec Class with parent Codec Class and specified buffSize.", ->
+          class MyBufferSubCodec
+            register(MyBufferSubCodec, MyBufferCodec, bufSize:32).should.be.ok
+
+            constructor: -> return super
+
+          myCodec = Codec('MyBufferSub')
+          testCodecInstance myCodec, MyBufferSubCodec, 32
+          myCodec.should.be.instanceOf MyBufferCodec
+        it "should register a new Codec Class with specified name", ->
+          class MyBufferSub1Codec
+            register(MyBufferSub1Codec, name:"bufit", bufSize:133).should.be.ok
+
+            constructor: -> return super
+
+          MyBufferSub1Codec.should.have.ownProperty 'register'
+          myCodec = Codec('bufit')
+          testCodecInstance myCodec, MyBufferSub1Codec, 133
+        it "should register a new Codec Class with specified name and parent.", ->
+          class MyBufferSub2Codec
+            register(MyBufferSub2Codec, MyBufferCodec, name:"bufit2", bufSize:132).should.be.ok
+
+            constructor: -> return super
+
+          myCodec = Codec('bufit2')
+          testCodecInstance myCodec, MyBufferSub2Codec, 132
+          myCodec.should.be.instanceOf MyBufferCodec
+      describe ".unregister", ->
+        it "should unregister a Codec Class via name.", ->
+          class MoCodec
+            register(MoCodec).should.be.ok
+            constructor: Codec
+          MoCodec.should.have.ownProperty 'unregister'
+          myCodec = Codec('Mo')
+          testCodecInstance myCodec, MoCodec
+          unregister('Mo').should.be.equal true
+          myCodec = Codec('Mo')
+          should.not.exist myCodec
+        it "should unregister a Codec Class via class.", ->
+          class MoCodec
+            register(MoCodec).should.be.ok
+            constructor: Codec
+          myCodec = Codec('Mo')
+          testCodecInstance myCodec, MoCodec
+          unregister(MoCodec).should.be.equal true
+          myCodec = Codec('Mo')
+          should.not.exist myCodec
+        it "should unregister a Codec Class with parent.", ->
+          class MoCodec
+            register(MoCodec, MyBufferCodec).should.be.ok
+            constructor: Codec
+          myCodec = Codec('Mo')
+          testCodecInstance myCodec, MoCodec
+          myCodec.should.be.instanceOf MyBufferCodec
+          MyBufferCodec.should.have.property 'mo', MoCodec
+          unregister('Mo').should.be.equal true
+          myCodec = Codec('Mo')
+          should.not.exist myCodec
+          MyBufferCodec.should.not.have.property 'Mo'
+          should.not.exist MyBufferCodec['mo']
+      describe ".constructor", ->
+        it "should get a global codec object instance", ->
+          MyCodec = getClass('MyNew', MyNewCodec)
+        it "should get a global codec object instance with specified bufferSize", ->
+          myCodec = Codec('MyNew', bufSize:123)
+          testCodecInstance(myCodec, MyNewCodec, 123)
+          myCodec.should.be.equal MyNewCodec()
+        it "should get a global codec object instance with specified bufferSize", ->
+          myCodec = Codec('MyBuffer', bufSize:33)
+          testCodecInstance(myCodec, MyBufferCodec, 33)
+          myCodec.should.be.equal MyBufferCodec()
+        it "should get a global codec object instance with specified bufferSize From the CodecClass", ->
+          MyCodec = getClass('MyBuffer', MyBufferCodec, 16)
+        it "should create a new codec object instance", ->
+          MyCodec = getClass('MyNew', MyNewCodec)
+          should.exist MyCodec
+          myCodec = new MyCodec()
+          testCodecInstance myCodec, MyNewCodec
+          myCodec.should.be.not.equal Codec("myNew")
+        it "should create a new codec object instance with specified bufferSize", ->
+          MyCodec = getClass('MyBuffer', MyBufferCodec, 12)
+          myCodec = new MyCodec(bufSize:13)
+          testCodecInstance myCodec, MyBufferCodec, 13
+          myCodec.should.be.not.equal Codec("MyBuffer")
+        it "should create a new codec object instance with specified bufferSize via child", ->
+          MyCodec = getClass('MyNewSub1', MyNewSub1Codec, 12)
+          myCodec = new MyCodec(bufSize:13)
+          testCodecInstance myCodec, MyNewSub1Codec, 13
+          myCodec.should.be.not.equal Codec("MyNewSub1")
+        it "should bypass the codec object instance", ->
+          myCodec = Codec('MyBuffer', bufSize:33)
+          my = Codec(myCodec)
+          my.should.be.equal myCodec
+        it "should bypass the codec object instance and expand the bufferSize", ->
+          myCodec = Codec('MyBuffer', bufSize:33)
+          my = Codec(myCodec, bufSize:900)
+          my.should.be.equal myCodec
+          my.bufferSize.should.at.least 900
+        it "should return undefined for unkown codec name", ->
+          myCodec = Codec('Notfound')
+          should.not.exist myCodec
+        it "should return undefined for illegal codec name argument", ->
+          myCodec = Codec()
+          should.not.exist myCodec
+
+
+      describe ".aliases", ->
+        class MyAliasCodec
+          register MyAliasCodec, Codec
+          aliases  MyAliasCodec, 'alia1', 'other'
+
+          constructor: -> return super
+
+        it "should get a global codec object instance via alias", ->
+          myCodec = Codec('alia1')
+          testCodecInstance myCodec, MyAliasCodec
+          other = Codec('other')
+          testCodecInstance myCodec, MyAliasCodec
+          other.should.equal myCodec
+        it "should remove aliases after unregister too", ->
+          unregister MyAliasCodec
+          myCodec = Codec('alia1')
+          should.not.exist myCodec, "alia1"
+          other = Codec('other')
+          should.not.exist myCodec, "other"
+
+    describe "Instance Methods", ->
+      describe ".toString()", ->
+        it "should get name toString", ->
+          myCodec = Codec('MyNew')
+          testCodecInstance myCodec, MyNewCodec
+          myCodec.toString().should.be.equal "MyNew".toLowerCase()
+      describe ".register()", ->
+        it "should register a class to itself", ->
+          class MyXCodec
+            aliases 'MyX', 'x', 'x1'
+            constructor: -> return super
+          myCodec = Codec('MyNew')
+          testCodecInstance myCodec, MyNewCodec
+          myCodec.register MyXCodec
+          myCodec = Codec("MyX")
+          testCodecInstance myCodec, MyXCodec
+          myCodec = Codec("x")
+          testCodecInstance myCodec, MyXCodec
+          myCodec = Codec("x1")
+          testCodecInstance myCodec, MyXCodec
+        it "should register a class to itself with options", ->
+          MyYCodec = createCtor "MyYCodec"
+          myCodec = Codec('MyNew')
+          testCodecInstance myCodec, MyNewCodec
+          myCodec.register MyYCodec, bufSize: 1301
+          myCodec = Codec("MyY")
+          testCodecInstance myCodec, MyYCodec, 1301
+      describe ".registered()", ->
+        it "should get registered instance from itself", ->
+          myCodec = Codec('MyNew')
+          testCodecInstance myCodec, MyNewCodec
+          myCodec = myCodec.registered 'MyY'
+          testCodecInstance myCodec, Codec['myy']
+          myCodec.should.be.equal Codec('MyY')
+      describe ".registeredClass()", ->
+        it "should get registered class from itself", ->
+          myCodec = Codec('MyNew')
+          testCodecInstance myCodec, MyNewCodec
+          MyY = myCodec.registeredClass 'MyY'
+          should.exist MyY, "MyY"
+          getClass "MyY", MyY
+      describe ".unregister()", ->
+        it "should unregister a class from itself", ->
+          myCodec = Codec('MyY')
+          testCodecInstance myCodec, Codec['myy']
+          myCodec.unregister("MyY").should.be.equal true
+          myCodec = Codec('MyY')
+          should.not.exist myCodec, "MyY"
+    describe "the aOptions could be non-object", ->
+      MyNCodec = createCtor "MyNCodec"
+      initSize = Math.random()
+      register MyNCodec, initSize
+      it "should pass non-object aOptions via register", ->
+        myCodec = Codec('MyNew')
+        testCodecInstance myCodec, MyNewCodec
+        myCodec = Codec("MyN")
+        testCodecInstance myCodec, MyNCodec, initSize
+      it "should pass non-object aOptions via Codec", ->
+        myCodec = Codec("MyN", 3512)
+        testCodecInstance myCodec, MyNCodec, 3512
+      it "should pass non-object aOptions via self", ->
+        v = Math.random()
+        myCodec = MyNCodec(v)
+        testCodecInstance myCodec, MyNCodec, v
+


factoring out discussion logic (for now, anyway)

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


Remove workspace snapshot data of kicked participant

--- client/ide/lib/collaborationcontroller.coffee
+++ client/ide/lib/collaborationcontroller.coffee
@@ -119,6 +119,8 @@
         showError err
         throwError err

+    @removeWorkspaceSnapshot target
+
     @setMachineUser [target], no, (err) =>
       return callbacks.error err  if err
       socialHelpers.kickParticipants @socialChannel, [account], (err, result) =>


Update pt-PT.coffee

Update pt-PT.coffee

--- app/locale/pt-PT.coffee
+++ app/locale/pt-PT.coffee
@@ -42,9 +42,9 @@
   diplomat_suggestion:
     title: "Ajuda a traduzir o CodeCombat!" # This shows up when a player switches to a non-English language using the language selector.
     sub_heading: "Precisamos das tuas habilidades linguísticas."
-    pitch_body: "Desenvolvemos o CodeCombat em Inglês, mas já temos jogadores em todo o mundo. Muitos deles querem jogar em Português e não falam Inglês, por isso, se sabes falar ambas, por favor considera registar-te como Diplomata para ajudares a traduzir o website do CodeCombat e todos os níveis para Português."
+    pitch_body: "Desenvolvemos o CodeCombat em Inglês, mas já temos jogadores de todo o mundo. Muitos deles querem jogar em Português, mas não falam Inglês, por isso, se sabes falar ambas, por favor considera registar-te como Diplomata para ajudares a traduzir o sítio do CodeCombat e todos os níveis para Português."
     missing_translations: "Enquanto não conseguirmos traduzir tudo para Português, irás ver em Inglês o que não estiver disponível em Português."
-    learn_more: "Sabe mais sobre ser um Diplomata"
+    learn_more: "Sabe mais sobre seres um Diplomata"
     subscribe_as_diplomat: "Subscreve-te como Diplomata"

   play:
@@ -336,7 +336,7 @@
     tip_adding_evil: "A acrescentar uma pitada de mal."
     tip_hate_computers: "É o problema das pessoas que acham que odeiam coputadores. O que elas odeiam mesmo são maus programadores. - Larry Niven"
     tip_open_source_contribute: "Podes ajudar a melhorar o CodeCombat!"
-#    tip_recurse: "To iterate is human, to recurse divine. - L. Peter Deutsch"
+    tip_recurse: "Iterar é humano, recursar é divino. - L. Peter Deutsch"

   game_menu:
     inventory_tab: "Inventário"
@@ -530,11 +530,11 @@
     press_paragraph_1_link: "pacote de imprensa"
     press_paragraph_1_suffix: ". Todos os logótipos e imagens podem ser usados sem sermos contactados diretamente."
     team: "Equipa"
-    george_title: "Co-fundador" # {change}
+    george_title: "Co-fundador"
     george_blurb: "Homem de Negócios"
-    scott_title: "Co-fundador" # {change}
+    scott_title: "Co-fundador"
     scott_blurb: "O Sensato"
-    nick_title: "Co-fundador" # {change}
+    nick_title: "Co-fundador"
     nick_blurb: "Guru da Motivação"
     michael_title: "Programador"
     michael_blurb: "Administrador do Sistema"
@@ -543,7 +543,7 @@
     cat_title: "Artesã Chefe"
     cat_blurb: "Mágica"
     josh_title: "Designer de Jogos"
-    josh_blurb: "O Chão é Lava"
+    josh_blurb: "Floor Is Lava"
     jose_title: "Música"
     jose_blurb: "Taking Off"
     retrostyle_title: "Ilustração"


Update pt-PT.coffee

Update pt-PT.coffee

--- app/locale/pt-PT.coffee
+++ app/locale/pt-PT.coffee
@@ -293,7 +293,7 @@
     tip_scrub_shortcut: "Usa Ctrl+[ para rebobinar e Ctrl+] para avançar."
     tip_guide_exists: "Clica no guia, dentro do menu do jogo (no topo da página), para informações úteis."
     tip_open_source: "O CodeCombat é 100% open source!"
-#    tip_tell_friends: "Enjoying CodeCombat? Tell your friends about us!"
+    tip_tell_friends: "Estás a gostar do CodeCombat? Fala de nós aos teus amigos!"
     tip_beta_launch: "O CodeCombat lançou o seu beta em outubro de 2013."
     tip_think_solution: "Pensa na solução, não no problema."
     tip_theory_practice: "Teoricamente, não há diferença entre a teoria e a prática. Mas na prática, há. - Yogi Berra"
@@ -337,7 +337,7 @@
     tip_recurse: "Iterar é humano, recursar é divino. - L. Peter Deutsch"
     tip_free_your_mind: "Tens de libertar tudo, Neo. Medo, dúvida e descrença. Liberta a tua mente. - Morpheus"
     tip_strong_opponents: "Até o mais forte dos adversários tem uma fraqueza. - Itachi Uchiha"
-#    tip_paper_and_pen: "Before you start coding, you can always plan with a sheet of paper and a pen."
+    tip_paper_and_pen: "Antes de começares a programar, podes sempre planear com uma folha de papel e uma caneta."

   game_menu:
     inventory_tab: "Inventário"
@@ -851,8 +851,8 @@
     indoor: "Interior"
     desert: "Deserto"
     grassy: "Relvado"
-#    mountain: "Mountain"
-#    glacier: "Glacier"
+    mountain: "Montanha"
+    glacier: "Glaciar"
     small: "Pequeno"
     large: "Grande"
     fork_title: "Bifurcar Nova Versão"
@@ -1211,7 +1211,7 @@
   delta:
     added: "Adicionado"
     modified: "Modificado"
-#    not_modified: "Not Modified"
+    not_modified: "Não Modificado"
     deleted: "Eliminado"
     moved_index: "Índice Movido"
     text_diff: "Diferença de Texto"


Clean data Update characters avatar

Clean data
Update characters avatar

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


Update configuration

Update configuration

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


Hotkey to focus files-tab is now 'f'

Hotkey to focus files-tab is now 'f'

Previously the hotkey to focus the files tab was 's'. Changing it to
'f' makes usage more intuitive for the user

The hotkey to fetch from repository was changed to 'p'

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


Added flash-loader module

Added flash-loader module

(The content is directly copied from app.coffee.)

error: pathspec 'lib/flash-loader.coffee' did not match any file(s) known to git

--- lib/flash-loader.coffee
+++ lib/flash-loader.coffee
@@ -0,0 +1,22 @@
+
+pepperFlashData =
+  linux:
+    filename: 'libpepflashplayer.so'
+    version: '20.0.0.248'
+  win32:
+    filename: 'pepflashplayer.dll'
+    version: '20.0.0.248'
+  darwin:
+    filename: 'PepperFlashPlayer.plugin'
+    version: '20.0.0.248'
+
+pepperFlashData = pepperFlashData[process.platform]
+innerFlashPath = path.join 'PepperFlash', process.platform, pepperFlashData.filename
+defaultFlashPath = path.join EXECROOT, innerFlashPath
+try
+  fs.accessSync defaultFlashPath
+  app.commandLine.appendSwitch 'ppapi-flash-path', defaultFlashPath
+  app.commandLine.appendSwitch 'ppapi-flash-version', pepperFlashData.version
+catch
+  app.commandLine.appendSwitch 'ppapi-flash-path', path.join(ROOT, innerFlashPath)
+  app.commandLine.appendSwitch 'ppapi-flash-version', pepperFlashData.version


Add icons describing history items

Add icons describing history 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/hlecuanda/conda-ui.git/'


remove url-regex

remove url-regex

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