4.0.27 compatibility

4.0.27 compatibility

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/davepwsmith/zotero-better-bibtex.git/'


Respect strict SSL setting in dedupe command

--- src/dedupe.coffee
+++ src/dedupe.coffee
@@ -42,6 +42,12 @@

     fs.makeTreeSync(@atomDirectory)
     config.loadNpm (error, npm) =>
+      # node-gyp doesn't currently have an option for this so just set the
+      # environment variable to bypass strict SSL
+      # https://github.com/TooTallNate/node-gyp/issues/448
+      useStrictSsl = npm.config.get('strict-ssl') ? true
+      env.NODE_TLS_REJECT_UNAUTHORIZED = 0 unless useStrictSsl
+
       # Pass through configured proxy to node-gyp
       proxy = npm.config.get('https-proxy') or npm.config.get('proxy')
       installNodeArgs.push("--proxy=#{proxy}") if proxy


:lipstick:

:lipstick:

--- spec/stdlib/underscore-extensions-spec.coffee
+++ spec/stdlib/underscore-extensions-spec.coffee
@@ -31,7 +31,7 @@
       expect(_.endsWith("test.txt", ".tx")).toBeFalsy()
       expect(_.endsWith("test.txt", "test")).toBeFalsy()

-  describe "camelize(string)", ->
+  describe "_.camelize(string)", ->
     it "converts `string` to camel case", ->
       expect(_.camelize("corey_dale_johnson")).toBe "coreyDaleJohnson"
       expect(_.camelize("corey-dale-johnson")).toBe "coreyDaleJohnson"
@@ -39,14 +39,14 @@
       expect(_.camelize("coreyDaleJohnson")).toBe "coreyDaleJohnson"
       expect(_.camelize("CoreyDaleJohnson")).toBe "CoreyDaleJohnson"

-  describe "dasherize(string)", ->
+  describe "_.dasherize(string)", ->
     it "converts `string` to use dashes", ->
       expect(_.dasherize("corey_dale_johnson")).toBe "corey-dale-johnson"
       expect(_.dasherize("coreyDaleJohnson")).toBe "corey-dale-johnson"
       expect(_.dasherize("CoreyDaleJohnson")).toBe "corey-dale-johnson"
       expect(_.dasherize("corey-dale-johnson")).toBe "corey-dale-johnson"

-  describe "underscore(string)", ->
+  describe "_.underscore(string)", ->
     it "converts `string` to use underscores", ->
       expect(_.underscore("corey-dale-johnson")).toBe "corey_dale_johnson"
       expect(_.underscore("coreyDaleJohnson")).toBe "corey_dale_johnson"


Pass vmName for all static methods

Pass vmName for all static methods

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


route pattern supports query strings

route pattern supports query strings

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


Add unit tests.

Add unit tests.

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

--- src/spec/services/channels.spec.coffee
+++ src/spec/services/channels.spec.coffee
@@ -0,0 +1,18 @@
+Q = require 'q'
+ChannelService = require '../../lib/services/channels'
+
+###*
+ * Describe service specific implementations
+###
+describe 'ChannelService', ->
+
+  beforeEach ->
+    @channels = new ChannelService
+
+  it 'should fail if key is not defined', ->
+    expect(=> @channels.ensure(undefined, 'role'))
+      .toThrow new Error 'Key is required.'
+
+  it 'should fail if role is not defined', ->
+    expect(=> @channels.ensure('key', undefined))
+      .toThrow new Error 'Role is required.'


fix (event emit) Emit nodered in next angular digest to make sure ng-model bindings are set before logic events.


Remove test "only" scope.

Remove test "only" scope.

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


Update metadata after applying an op.

Update metadata after applying an op.

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/lmjohns3/thorax-media.git/'


TODO; add spec for future automated tests

(From NetPleadings)

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

--- spec/spec.coffee
+++ spec/spec.coffee
@@ -0,0 +1,230 @@
+#
+# Knockout Modal Testing
+#
+# -----
+# FIXME!
+# The following is not yet working; it has been haphazardly copied here from
+# live code.
+#
+_ = require 'lodash'
+$ = require 'jquery'
+ko = require 'knockout'
+
+require '../testing.coffee'
+
+# modals = require '../modals.coffee'
+
+modal_html = """
+<template id='test-modal'>
+

+

+

+

+        5Vh
+

+

+
DATA: {{$data|json}}

+

+

+        6Lw
+

+

+

+

+</template>
+"""
+
+$container = $("#modals-transient")
+
+describe("#{__filename}  | ModalStrategy", ->
+  @timeout(1500)
+  INITIAL_STATE = {type: 'test', state: 'INITIAL-ZmA'}
+  modal_node = undefined
+  ms = undefined
+  beforeEach ->
+    window.history.replaceState(INITIAL_STATE, '')
+    $container.empty()
+    modal_node = $(modal_html).appendTo(document.body)
+
+  afterEach ->
+    modal_node.remove()
+    ms?.node?.remove()
+    $(".modal-backdrop").remove()
+    assert.ok(
+      $container.is(":empty"),
+      "#modals-transient is empty"
+    )
+    assert.lengthOf($(".NP-modal-transient"), 0, "transient modals")
+
+  describe("with history disabled", ->
+    beforeEach ->
+      sinon.stub(ModalStrategy::, 'push_history_state', ->)
+
+    afterEach ->
+      ModalStrategy::push_history_state.restore()
+
+    it "Copies an existing entity", ->
+      ms = new ModalStrategy('test-modal', {})
+      assert.lengthOf($(document.body).find(ms.node), 1)
+
+    it "Opens the modal", ->
+      ms = new ModalStrategy('test-modal', {})
+      assert.ok(ms.node.data('bs.modal').isShown, 'isShown')
+      assert.lengthOf(ms.node.parent(), 1)
+
+    it "adds ModalStrategy property to .data", ->
+      ms = new ModalStrategy('test-modal', {})
+      assert.strictEqual(ms, ms.node.data('ModalStrategy'))
+
+    it "binds with the data passed in", ->
+      obj = {C4D: 'Ckw'}
+      ms = new ModalStrategy('test-modal', obj)
+      assert.strictEqual(ko.dataFor(ms.node[0]), obj)
+
+    it "does not double-apply bindings", ->
+      obj = {xhD: '2V8'}
+      ms = new ModalStrategy('test-modal', obj)
+      ModalStrategy.remove_all()
+      ModalStrategy.restore(ms.idx)
+      assert.strictEqual(ko.dataFor(ms.node[0]), obj)
+
+    it ".created resolves when rendered", (done) ->
+      obj = {nGA: 'nih'}
+      ms = new ModalStrategy('test-modal', obj)
+      ms.created
+        .then((node) ->
+          assert.strictEqual(ms.node, node)
+          done()
+        ).catch(done)
+
+    it "binds the results of a promise", (done) ->
+      obj = {cfN: 'bRu'}
+      ms = new ModalStrategy('test-modal', Promise.resolve(obj))
+      ms.created
+        .then(->
+          assert.strictEqual(ko.dataFor(ms.node[0]), obj)
+          done()
+        ).catch(done)
+
+    it "does not bind to anything in the original template", ->
+      # One could have bindings on a template, though this would
+      # be convoluted.
+      ms = new ModalStrategy('test-modal', {})
+      assert.strictEqual(ko.dataFor(modal_node[0]), undefined)
+  )
+
+  describe('with one history step', ->
+    afterEach (done) ->
+      $(window).one('popstate', ->
+        assert.deepEqual(window.history.state, INITIAL_STATE)
+        done()
+      )
+      window.history.back()
+
+    it "adds itself to the history state", ->
+      ms = new ModalStrategy('test-modal', {})
+      assert.equal(window.history.state.type, 'ModalStrategy')
+
+    it "references the data in ModelStrategy.states", ->
+      obj = {b2a: 'bJp'}
+      ms = new ModalStrategy('test-modal', obj)
+      assert.deepEqual(ms, ModalStrategy.states[ms.idx])
+  )
+
+  describe('nested modals', ->
+    it "on back", (done) ->
+      d1 = type: 'test', v: 'ixT'
+      d2 = type: 'test', v: 'jQe'
+      ms1 = new ModalStrategy('test-modal', d1)
+      ms2 = new ModalStrategy('test-modal', d2)
+
+      assert.equal($("#modals-transient .modal").length, 2)
+      $container
+        .on('hidden.bs.modal', _.after 2, ->
+          $container.off('hidden.bs.modal')
+          done()
+        )
+
+      on_pop_2 = ->
+        assert.deepEqual(window.history.state, INITIAL_STATE, 'bSS')
+
+      on_pop_1 = ->
+        assert.deepEqual(window.history.state, ms1.state)
+        $(window).one('popstate', on_pop_2)
+        window.history.back()
+
+      $(window).one('popstate', on_pop_1)
+      window.history.back()
+
+    it "on hide", (done) ->
+      d1 = type: 'test', v: 'gLj'
+      d2 = type: 'test', v: 'h1e'
+      ms1 = new ModalStrategy('test-modal', d1)
+      ms2 = new ModalStrategy('test-modal', d2)
+
+      assert.equal($("#modals-transient .modal").length, 2)
+      $container
+        .on('hidden.bs.modal', _.after 2, ->
+          $container.off('hidden.bs.modal')
+          done()
+        )
+
+      on_pop_2 = ->
+        assert.deepEqual(window.history.state, INITIAL_STATE, 'bSS')
+
+      on_pop_1 = ->
+        assert.deepEqual(window.history.state, ms1.state)
+        $(window).one('popstate', on_pop_2)
+        ms1.node.modal('hide')
+
+      $(window).one('popstate', on_pop_1)
+      ms2.node.modal('hide')
+  )
+
+  it "removes itself from the history when closed", (done) ->
+    ms = new ModalStrategy('test-modal', {})
+    $(window).one('popstate', ->
+      assert.deepEqual(window.history.state, INITIAL_STATE)
+      done()
+    )
+    ms.node.modal('hide')
+
+  it "closes on the 'back' button event", (done) ->
+    ms = new ModalStrategy('test-modal', {type: 'test', test: 'qme'})
+    assert.equal(window.history.state.type, 'ModalStrategy')
+    $(window).one('popstate', -> _.defer ->
+      assert.notOk(ms.node.data('bs.modal')?.isShown)
+      done()
+    )
+    window.history.back()
+
+  it "reloads on the 'forward' button event"
+
+)
+
+
+describe("#{__filename}  | window.history", ->
+  # Note: http://stackoverflow.com/questions/14112341
+  # -- history.pushState does not trigger popstate.
+  @timeout(500)
+
+  it "history.back triggers popstate with prior state", (done) ->
+    window.history.pushState(type: 'test', test:'C1P') # Original
+    window.history.pushState(type: 'test', test:'JQo') # New state
+    $(window).one('popstate', (evt) ->
+      assert.equal(evt.originalEvent.state.test, 'C1P')
+      window.history.back()  # Revert to pre-test state
+      done()
+    )
+    window.history.back()
+
+  it "after popstate the history.state is the new state", (done) ->
+    window.history.pushState(type: 'test', test:'b9K') # Original
+    window.history.pushState(type: 'test', test:'E6s') # New state
+    $(window).one('popstate', (evt) ->
+      assert.equal(history.state.test, 'b9K')
+      window.history.back()  # Revert to pre-test state
+      done()
+    )
+    window.history.back()
+)


Add SOT89-5 pattern generator

Add SOT89-5 pattern generator

error: pathspec 'src/pattern/default/sot89-5.coffee' did not match any file(s) known to git

--- src/pattern/default/sot89-5.coffee
+++ src/pattern/default/sot89-5.coffee
@@ -0,0 +1,61 @@
+sprintf = require('sprintf-js').sprintf
+
+assembly = require './common/assembly'
+calculator = require './common/calculator'
+copper = require './common/copper'
+courtyard = require './common/courtyard'
+silkscreen = require './common/silkscreen'
+
+module.exports = (pattern, element) ->
+  housing = element.housing
+  housing.polarized = true
+  housing.flatlead = true
+  housing.leadCount ?= 5
+  settings = pattern.settings
+  pattern.name ?= sprintf "SOTFL%dP%dX%d-%d%s",
+    [housing.pitch*100
+    housing.leadSpan.nom*100
+    housing.height.max*100
+    housing.leadCount]
+    .map((v) => Math.round v)...,
+    settings.densityLevel
+
+  # Calculate pad dimensions according to IPC-7351
+  padParams = calculator.sot pattern, housing
+
+  pad1 =
+    type: 'smd'
+    shape: 'rectangle'
+    width: padParams.width1
+    height: padParams.height1
+    layer: ['topCopper', 'topMask', 'topPaste']
+  pad2 =
+    type: 'smd'
+    shape: 'rectangle'
+    x: 0
+    y: 0
+    width: padParams.width2 + padParams.distance
+    height: padParams.height2
+    layer: ['topCopper', 'topMask', 'topPaste']
+
+
+  pad1.x = -padParams.distance / 2
+  pad1.y = -housing.pitch
+  pattern.pad 1, pad1
+
+  pattern.pad 2, pad2
+
+  pad1.y = housing.pitch
+  pattern.pad 3, pad1
+
+  pad1.x = padParams.distance / 2
+  pattern.pad 4, pad1
+
+  pad1.y = -housing.pitch
+  pattern.pad 5, pad1
+
+  # Other layers
+  copper.mask pattern
+  silkscreen.dual pattern, housing
+  assembly.polarized pattern, housing
+  courtyard.dual pattern, housing, padParams.courtyard


Add tests

Add tests

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

--- test/tests.coffee
+++ test/tests.coffee
@@ -0,0 +1,64 @@
+node = require '../lib/node'
+election = require '../lib/election'
+async = require 'async'
+assert = require 'assert'
+index = require '../lib/index'
+
+main_test = (cb) ->
+	console.log "main test"
+	options =
+		type: 'tcp'
+	n1 = index.createNode(options)
+	n1.on 'ready', () ->
+		#n1.subscribe 'chan1'
+		setInterval () ->
+			n1.publish 'chan1', "msg#{process.pid}"
+		, 1000
+	n1.on 'message', (msg...) ->
+		console.dir (m.toString() for m in msg)
+
+	setTimeout () ->
+		cb(null)
+	, 5000
+
+node_test = (cb) ->
+	console.log "node test"
+	n1 = new node.ElectedNode()
+	n1.on 'ready', () ->
+		#n1.subscribe 'chan1'
+		setInterval () ->
+			n1.publish 'chan1', "msg#{process.pid}"
+		, 1000
+	n1.on 'message', (msg...) ->
+		console.dir (m.toString() for m in msg)
+
+	setTimeout () ->
+		cb(null)
+	, 5000
+
+election_test = (cb) ->
+	console.log "election test"
+	elector = new election.Elector({pid: process.pid})
+	elector.on 'ready', (addr) ->
+		console.log "starting id: #{elector.id}"
+		elector.start()
+	elector.on 'error', (err) ->
+		console.dir err
+	elector.on 'message', (msg, rinfo) ->
+		console.dir msg
+		#console.dir rinfo
+	elector.on 'elected', (elect) ->
+		console.log 'elected'
+		console.dir elect
+
+	setTimeout () ->
+		cb(null)
+	, 5000
+
+async.series [
+	main_test
+	node_test
+	election_test
+], (res) ->
+	assert(res == null)
+	process.exit()


fix (View) Remove extra fat arrow causing lint failure


Call callback after hitting instanceURL

Call callback after hitting instanceURL

--- src/scripts/meme_generator.coffee
+++ src/scripts/meme_generator.coffee
@@ -60,5 +60,4 @@

       msg.http(instanceURL).get() (err, res, body) ->
         # Need to hit instanceURL so that image gets generated
-
-      callback img
+        callback img


Utils specs

Utils specs

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

--- spec/util-spec.coffee
+++ spec/util-spec.coffee
@@ -0,0 +1,14 @@
+uri = require('../lib/util/uri-helpers')
+
+xdescribe 'resolveURL()', ->
+  it 'should replace the last segment', ->
+    expect(uri.resolveURL('a', 'b')).toBe 'b'
+    expect(uri.resolveURL('x/y', 'z')).toBe 'x/z'
+    expect(uri.resolveURL('m', 'n/o')).toBe 'n/o'
+    expect(uri.resolveURL('a/b', 'c/d')).toBe 'a/c/d'
+
+  it 'should replace absolute segments', ->
+    expect(uri.resolveURL('//a/b/c', '/y/z')).toBe '//a/y/z'
+
+  it 'should resolve relative segments', ->
+    expect(uri.resolveURL('a/b/c', '../x')).toBe 'a/x'


Improve Documentation

Improve Documentation

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -560,10 +560,10 @@
       # 2. Set `failed` key of returned object.
       statistics = multi_res[0] or {}
       result =
-        total_tasks : statistics.total or 0
-        finished_tasks : statistics.finished or 0
-        average_pending_time : Math.round(statistics.total_pending_time * 100 / statistics.finished) / 100
-        average_processing_time : Math.round(statistics.total_processing_time * 100 / statistics.finished) / 100
+        total_tasks: statistics.total or 0
+        finished_tasks: statistics.finished or 0
+        average_pending_time: Math.round(statistics.total_pending_time * 100 / statistics.finished) / 100
+        average_processing_time: Math.round(statistics.total_processing_time * 100 / statistics.finished) / 100
       if not result.finished_tasks
         result.average_pending_time = '-'
         result.average_processing_time = '-'
@@ -572,13 +572,14 @@

       # Start another transaction to get all `BLOCKED` tasks.
       #
-      # 1. Set `blocked.groups` of returned object.
-      # 2. Count blocked tasks. Blocked tasks are tasks in the `QUEUED` list whose
-      # group identifier is in the `BLOCKED` set. The first element of each
-      # `QUEUED` list will not be counted, since that's the blocking (already
-      # failed) task.
-      # 3. Calculate the pending tasks. The equation is:
+      #   1. Set `blocked.groups` of returned object.
+      #   2. Count blocked tasks. Blocked tasks are tasks in the `QUEUED` list whose
+      #   group identifier is in the `BLOCKED` set. The first element of each
+      #   `QUEUED` list will not be counted, since that's the blocking (already
+      #   failed) task.
+      #   3. Calculate the pending tasks.
       #
+      # The equation used to calculate pending tasks is:
       #
       #     pending = total - finished - processing - blocked - failed
       multi = @redis.multi()


Update Documentation

Update Documentation

--- src/fairy.coffee
+++ src/fairy.coffee
@@ -282,19 +282,23 @@

   # ### Register Handler

-  # When registering a processing handler function, **Fairy** will immediately
-  # start polling tasks and process them on present. **Usage:**
+  # When registered a processing handler function, the queue becomes a worker
+  # automatically: **Fairy** will immediately start polling tasks and process
+  # them on present.
+  #
+  # When becomes a worker, **Fairy** will regist an uuid (v4) key in the
+  # `WORKERS` hash for the queue, and remove the key on exit. Except for hard
+  # termination like `SIGKILL`, monitoring the `WORKERS` hash will give you
+  # an overview of online workers. **Usage:**
   #
   #     queue.regist (param1, param2, callback) ->
   #       console.log param1, param2
   #       callback()
   regist: (@handler) =>
-    registered.push "#{@fairy.id}:#{@name}"
+    registered.push "#{@fairy.id}|#{@name}"
     worker_id = uuid.v4()
-    @redis.hset @key('WORKERS'), worker_id, "#{os.hostname()}:#{get_server_ip()}:#{process.pid}"
-    process.on 'exit', =>
-      console.log 'Fairy is exiting.'
-      @redis.hdel @key('WORKERS'), worker_id
+    @redis.hset @key('WORKERS'), worker_id, "#{os.hostname()}|#{get_server_ip()}|#{process.pid}"
+    process.on 'exit', => @redis.hdel @key('WORKERS'), worker_id
     @_poll()

   # ### Poll New Task
@@ -611,7 +615,7 @@
   # ### Get Workers Asynchronously
   #
   # Get all online workers of the queue. Online workers are registered in the
-  # `WORKERS` hash, the values is in `hostname:ip:pid` format.  **Usage:**
+  # `WORKERS` hash, the values is in `hostname|ip|pid` format.  **Usage:**
   #
   #     queue.workers (workers) ->
   #       console.log "Total #{workers.length} workers is online."
@@ -619,7 +623,8 @@
   #         console.log worker.host, worker.ip, worker.pid

   # `workers` is an asynchronous method. The only arg of the callback
-  # function is an array of online workers of the queue. Each worker object has:
+  # function is an array of online workers of the queue. Each worker object
+  # have:
   #
   #   + `host`, the host name of the worker machine.
   #   + `ip`, the first external IPv4 address of the worker machine.
@@ -627,7 +632,7 @@
   workers: (callback) ->
     @redis.hvals @key('WORKERS'), (err, res) ->
       callback res.map (entry) ->
-        segments = entry.split ':'
+        segments = entry.split '|'
         {
           host: segments[0]
           ip: segments[1]


Adding a method of executing scripts fetched via AJAX in IE8+. Also adds inputtype-specific handlers so that javascript can be executed when an inputtype is encountered.

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


group route

group route

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

--- src/group.coffee
+++ src/group.coffee
@@ -0,0 +1,23 @@
+boom =			require 'boom'
+
+
+
+
+
+module.exports = (req, reply) ->
+	orm = @orm
+
+	orm.groups.get req.params.group
+	.then (group) ->
+		if not group then return reply boom.notFound "There is no group <code>#{req.params.group}</code>."
+
+		response =
+			group:		req.params.group
+
+		orm.messages.all req.params.group
+		.then (messages) ->
+			response.messages = messages
+			reply response
+
+		.catch (err) -> throw err
+	.catch (err) -> throw err


No need to minimize handlebars, remove spaces from extensions, don't trust config object to store src and dest

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/NewSpring/norma-markup.git/'


adds ember application adapter

adds ember application adapter

error: pathspec 'ember-checkout/app/adapters/application.coffee' did not match any file(s) known to git

--- ember-checkout/app/adapters/application.coffee
+++ ember-checkout/app/adapters/application.coffee
@@ -0,0 +1,9 @@
+`import DS from 'ember-data'`
+
+ApplicationAdapter = DS.RESTAdapter.extend
+  namespace: 'api'
+  headers:
+    'X-Spree-Order-Token': Spree.current_order_token
+    'Accept':              'application/json'
+
+`export default ApplicationAdapter`


Get rid of copy-paste for the list of examples

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


Do not hide the whole section after uninstall

When an app was uninstalled, it hided its whole section. Now it hides it only
if there is no more app in this section.

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


bugfix - name in navbar

bugfix - name in navbar


Initial utility template

Initial utility template

error: pathspec 'app/templates/node/util.coffee' did not match any file(s) known to git

--- app/templates/node/util.coffee
+++ app/templates/node/util.coffee
@@ -0,0 +1,26 @@
+# Utility
+# =======
+#
+# > (c)
+
+'use strict'
+
+
+# Days Passed
+# -----------
+#
+# Return the number days has passed since the beginning of the year or from a
+# specific `start` date. The date must be in the format of 'YYYY-MM-DD' string.
+#
+# See gist: <https://gist.github.com/realguess/6528734>
+#
+# TODO: Update gists due to the new parameter.
+daysPassed = (start) ->
+  seconds = 60 * 60 * 24
+  if start
+    start = new Date start
+  else
+    start = new Date '' + new Date().getFullYear()
+  today   = new Date new Date().toISOString().substr 0, 10
+
+  return (today.getTime() - start.getTime()) / (1000 * seconds)


Add Home JS Response for Devise Login

Add Home JS Response for Devise Login

Add a Home JS response in order to account for a successful login
attempt directing the user to the Home page (thus re-rendering the view
with the correct links for a signed-in user).

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

--- app/views/home/index.js.coffee
+++ app/views/home/index.js.coffee
@@ -0,0 +1 @@
+window.location.replace "<%= root_path %>"


Remove unused code

Remove unused code

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


fix: isPromise

fix: isPromise

--- src/utils.coffee
+++ src/utils.coffee
@@ -8,9 +8,6 @@

 isFunction = (obj) ->
 	typeof obj == 'function'
-
-isObject = (obj) ->
-	typeof obj == 'object'

 utils = module.exports =

@@ -277,7 +274,7 @@
 	 * @return {Boolean}
 	###
 	isPromise: (obj) ->
-		isObject(obj) and isFunction(obj.then)
+		obj and isFunction(obj.then)

 	###*
 	 * Convert a node callback style function to a function that returns


Collaboration: over channelId on JMachine instances

--- workers/social/lib/social/models/collaboration.coffee
+++ workers/social/lib/social/models/collaboration.coffee
@@ -2,6 +2,7 @@

 google       = require 'googleapis'
 google_utils = require 'koding-googleapis'
+KodingError  = require '../error'

 { notifyByUsernames } = require './notify'

@@ -14,7 +15,7 @@
   @set
     sharedMethods :
       static      :
-        stop      : (signature String, Object, Function)
+        stop      : (signature String, String, Function)
         add       : (signature String, Object, Function)
         kick      : (signature String, Object, Function)

@@ -38,10 +39,9 @@
     return google_utils.authenticated options, method

-  unshareMachine = (workspace, callback) ->
-    uid = workspace.machineUId
+  unshareMachine = (channelId, callback) ->

-    JMachine.one { uid }, (err, machine) ->
+    JMachine.one { channelId }, (err, machine) ->
       owner = null

       for user in machine.users when user.sudo and user.owner
@@ -51,7 +51,7 @@
       machine.update { $set: { users: [owner] } }, callback

-  @stop = secure authenticated (client, fileId, workspace, callback) ->
+  @stop = secure authenticated (client, fileId, channelId, callback) ->

     getRealtimeDocument fileId, (err, doc) ->

@@ -66,32 +66,39 @@
       { timeout } = KONFIG.collaboration

       if (Date.now() - lastSeen.getTime()) > timeout
-      then unshareMachine workspace, callback
+      then unshareMachine channelId, callback
       else callback 'host is alive'

-  @add = secure (client, machineUId, target, callback) ->
+  @add = secure (client, channelId, target, callback) ->

     asUser  = yes
     options = { target, asUser }
-    setUsers client, machineUId, options, (err, machine) ->
+    setUsers client, channelId, options, (err, machine) ->
       return callback err  if err

-      data =  { machineUId, group: client?.context?.group }
+      data =  { channelId, group: client?.context?.group }

       notifyByUsernames options.target, 'CollaborationInvitation', data

       callback()

-  @kick = secure (client, machineUId, target, callback) ->
+  @kick = secure (client, channelId, target, callback) ->

     asUser  = no
     options = { target, asUser }
-    setUsers client, machineUId, options, callback
+    setUsers client, channelId, options, (err, machine) ->
+      callback err, machine

-  setUsers = (client, machineUId, options, callback) ->
+  setUsers = (client, channelId, options, callback) ->

     options.permanent = no
-    JMachine.shareByUId client, machineUId, options, callback
+    JMachine.one { channelId }, (err, machine) ->
+
+      return callback err  if err
+      return callback new KodingError 'Machine not found'  unless machine
+
+      machine.shareWith$ client, options, (err) ->
+        callback err, machine


node/workers: add forgotten model file

node/workers: add forgotten model file

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


Got rid of file.

Got rid of file.

--- test/what.coffee
+++ test/what.coffee
@@ -1,38 +0,0 @@
-
-should = require('chai').should()
-io = require 'socket.io-client'
-
-describe 'the express.io app', ->
-    client = undefined
-    before (done) ->
-        app = require('../lib/index')()
-        app.http().io()
-
-        app.io.route 'test-respond', (request) ->
-            console.log 'respond dummy'
-            request.io.respond 'respond works'
-
-        app.io.route 'test-emit', (request) ->
-            console.log 'emit works good'
-            request.io.emit 'test-emit', 'emit works'
-
-        app.listen 7076, ->
-            client = io.connect 'http://localhost:7076'
-            done()
-
-
-    it 'should emit', (done) ->
-        client.on 'test-emit', (message) ->
-            message.should.equal 'emit works'
-            client.disconnect()
-            done()
-        client.emit 'test-emit'
-
-    it 'should respond', (done) ->
-        console.log 'should respond'
-
-        client.emit 'test-respond', {}, (message) ->
-            message.should.equal 'respond works'
-            client.disconnect()
-            done()
-


Update pt-PT.coffee

Update pt-PT.coffee

--- app/locale/pt-PT.coffee
+++ app/locale/pt-PT.coffee
@@ -227,7 +227,7 @@
     tome_available_spells: "Feitiços Disponíveis"
     tome_your_skills: "As Tuas Habilidades"
     hud_continue: "Continuar (shift-espaço)"
-#    code_saved: "Code Saved"
+    code_saved: "Código Guardado"
     skip_tutorial: "Saltar (esc)"
     keyboard_shortcuts: "Atalhos do Teclado"
     loading_ready: "Pronto!"
@@ -494,7 +494,7 @@
     level_tab_thangs_add: "Adicionar Thangs"
     delete: "Eliminar"
     duplicate: "Duplicar"
-#    rotate: "Rotate"
+    rotate: "Rodar"
     level_settings_title: "Configurações"
     level_component_tab_title: "Componentes Atuais"
     level_component_btn_new: "Criar Novo Componente"


Reverse sort task updates just like requests updates (https://github.com/HubSpot/Singularity/blob/5476c5fdf6c672ae1729967e8b2b8753e865eb6f/SingularityUI/app/models/RequestHistory.coffee#L19-L20)

--- SingularityUI/app/models/TaskHistory.coffee
+++ SingularityUI/app/models/TaskHistory.coffee
@@ -28,6 +28,9 @@
             if taskUpdate.statusUpdate is 'TASK_FINISHED'
                 taskHistory.task.isFinished = true

+        _.sortBy taskHistory.taskUpdates, (t) -> t.timestamp
+        taskHistory.taskUpdates.reverse()
+
         # Construct mesos logs link
         taskHistory.mesosMasterLogsLink = "http://#{ app.state.get('masterLogsDomain') }/#/slaves/#{ taskHistory.task.offer.slaveId.value }/browse?path=#{ taskHistory.directory }"


new (Net) index.coffee

new (Net) index.coffee

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

--- src/addons/Net/index.coffee
+++ src/addons/Net/index.coffee
@@ -0,0 +1,13 @@
+net = require 'net'
+
+module.exports = {
+    net:
+        isIP: (input) ->
+            net.isIP(input)
+
+        isIPv4: (input) ->
+            net.isIPv4(input)
+
+        isIPv6: (input) ->
+            net.isIPv6(input)
+}


Basic version should work, but currently untested

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

--- src/scripts/reputation-links.coffee
+++ src/scripts/reputation-links.coffee
@@ -0,0 +1,34 @@
+# Description:
+#   Generate links for doing IP/URL research
+#
+# Dependencies:
+#   None
+#
+# Configuration:
+#   None
+#
+# Commands:
+#   hubot yara - Generates default rule template
+#   hubot yara "string1" "string2" ... - Generates rule with given strings
+#
+# Author:
+#   Scott J Roberts - @sroberts
+
+module.exports = (robot) ->
+  robot.respond /reputation ip (.*)/i, (msg) ->
+    target_ip = msg.match[1].toLowerCase()
+
+    reputation_links = """
+    - Robtext:    https://ip.robtex.com/#{target_ip}.html
+    - CentralOps: http://centralops.net/co/DomainDossier.aspx?addr=#{target_ip}&dom_dns=1&dom_whois=1&net_whois=1
+    - IPVoid:     http://www.ipvoid.com/scan/#{target_ip}/
+    """
+
+  robot.respond /reputation url (.*)/i, (msg) ->
+    target_url = msg.match[1].toLowerCase()
+
+    reputation_links = """
+    - Robtext:    https://pop.robtex.com/#{target_url}.html
+    - CentralOps: http://centralops.net/co/DomainDossier.aspx?addr=#{target_url}&dom_whois=true&dom_dns=true&net_whois=true
+    - URLVoid:    http://www.urlvoid.com/scan/#{target_url}/
+    """


expose cdnUrlModifiers for ReadyFiles

expose cdnUrlModifiers for ReadyFiles

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/prognostikos/uploadcare-widget.git/'


Update en.coffee

Update en.coffee

--- app/locale/en.coffee
+++ app/locale/en.coffee
@@ -322,6 +322,7 @@
     tip_lines_of_code: "Measuring programming progress by lines of code is like measuring aircraft building progress by weight. — Bill Gates"
     tip_source_code: "I want to change the world but they would not give me the source code."
     tip_javascript_java: "Java is to JavaScript what Car is to Carpet. - Chris Heilmann"
+    tip_move_forward: "Whatever you do, keep moving forward. - Martin Luther King Jr."

   game_menu:
     inventory_tab: "Inventory"


Update gl.coffee

Update gl.coffee

--- app/locale/gl.coffee
+++ app/locale/gl.coffee
@@ -25,49 +25,49 @@
     home: "Inicio"
     contribute: "Colaborar"
     legal: "Legalidade"
-    about: "Sobre nó"
+    about: "Sobre nós"
     contact: "Contacta"
     twitter_follow: "Síguenos en Twitter"
     teachers: "Profesores"

   modal:
-    close: "Cerrar"
+    close: "Pechar"
     okay: "Ok"

   not_found:
-    page_not_found: "Páxina no atopada"
+    page_not_found: "Páxina non atopada"

   diplomat_suggestion:
     title: "Axuda a traducir CodeCombat!" # This shows up when a player switches to a non-English language using the language selector.
     sub_heading: "Necesitamos das túas habilidades lingüisticas."
     pitch_body: "Nos desenvolvemos CodeCombat en inglés, pero xa temos xogadores de todo o mundo. Moitos deles queren xogar en galego porque non falan inglés, así que si falas ambos idiomas, inscríbete como Diplomático e axuda a traducir a web e todos os niveis de CodeCombat ao galego."
-    missing_translations: "Mientras terminamos la traducción al español, verás en inglés las partes que no estén todavía disponibles."
-    learn_more: "Aprende más sobre ser un Diplomático"
+    missing_translations: "Mentras terminamos a traducción ao galego, verás en castelán ou en inglés as partes que non estén ainda dispoñibles."
+    learn_more: "Aprende máis sobre o que é ser un Diplomático"
     subscribe_as_diplomat: "Suscríbete como Diplomático"

   play:
-    play_as: "Jugar como" # Ladder page
-    spectate: "Observar" # Ladder page
-    players: "jugadores" # Hover over a level on /play
-    hours_played: "horas jugadas" # Hover over a level on /play
-    items: "Objetos" # Tooltip on item shop button from /play
+    play_as: "Xogar como" # Ladder page
+    spectate: "Mirar" # Ladder page
+    players: "xogadores" # Hover over a level on /play
+    hours_played: "horas xogadas" # Hover over a level on /play
+    items: "Obxectos" # Tooltip on item shop button from /play
     heroes: "Heroes" # Tooltip on hero shop button from /play
     achievements: "Logros" # Tooltip on achievement list button from /play
-    account: "Cuenta" # Tooltip on account button from /play
-    settings: "Ajustes" # Tooltip on settings button from /play
-    next: "Siguiente Heroe" # Go from choose hero to choose inventory before playing a level
+    account: "Conta" # Tooltip on account button from /play
+    settings: "Axustes" # Tooltip on settings button from /play
+    next: "Seguente Heroe" # Go from choose hero to choose inventory before playing a level
     change_hero: "Seleccionar Heroe" # Go back from choose inventory to choose hero
-    choose_inventory: "Equipar Objetos"
+    choose_inventory: "Equipar Obxectos"
     older_campaigns: "Campañas Anteriores"
-    anonymous: "Jugador Anonimo"
-    level_difficulty: "Dificultad: "
+    anonymous: "Xogador Anónimo"
+    level_difficulty: "Dificultade: "
     campaign_beginner: "Campaña de Principiante"
-    choose_your_level: "Elige tu nivel" # The rest of this section is the old play view at /play-old and isn't very important.
-    adventurer_prefix: "Puedes elegir cualquier pantalla o charlar en "
-    adventurer_forum: "el foro del aventurero "
-    adventurer_suffix: "sobre ello."
-    campaign_old_beginner: "Antigua Campaña de Principiante"
-    campaign_old_beginner_description: "... en la que aprenderás la magia de la programación."
+    choose_your_level: "Elixe o teu nivel" # The rest of this section is the old play view at /play-old and isn't very important.
+    adventurer_prefix: "Podes elixir calqueira pantalla ou falar no "
+    adventurer_forum: " foro do aventureiro "
+    adventurer_suffix: "sobre elo."
+    campaign_old_beginner: "Antiga Campaña de Principiante"
+    campaign_old_beginner_description: "... na que aprenderás xa maxia da programación."
     campaign_dev: "Niveles aleatorios más dificiles"
     campaign_dev_description: "... en los que aprenderás sobre la interfaz mientras haces algo más difícil."
     campaign_multiplayer: "Arenas Multijugador"


Update ja.coffee

Update ja.coffee

Various translations added and some minor fixes.

--- app/locale/ja.coffee
+++ app/locale/ja.coffee
@@ -3,15 +3,15 @@
     slogan: "ゲームをプレイしてコードを学びましょう"
     no_ie: "大変申し訳ありませんが、ご利用のブラウザ（IE8以下）はサポートされていません。(ChromeやFirefoxをご利用ください)" # Warning that only shows up in IE8 and older
     no_mobile: "CodeCombat は携帯端末向けに制作されていないため、動作しない可能性があります。" # Warning that shows up on mobile devices
-    play: "ゲーム    スタート" # The big play button that opens up the campaign view.
+    play: "ゲーム\スタート" # The big play button that opens up the campaign view.
     old_browser: "ご利用のブラウザはCodeCombatを動作させるには古すぎるようです" # Warning that shows up on really old Firefox/Chrome/Safari
     old_browser_suffix: "このまま進めることもできますが、正常動作は保証されません"
-#    ipad_browser: "Bad news: CodeCombat doesn't run on iPad in the browser. Good news: our native iPad app is awaiting Apple approval."
+    ipad_browser: "悪い知らせ:CodeCombatは、iPadのブラウザでは動作しません。良い知らせ: 私達のネイティブiPadアプリはアップルの承認待ち中。"
     campaign: "キャンペーンモード"
     for_beginners: "初心者向け"
     multiplayer: "マルチプレイヤー" # Not currently shown on home page
     for_developers: "開発者向け" # Not currently shown on home page.
-#    or_ipad: "Or download for iPad"
+    or_ipad: "又はiPadでダウンロード"

   nav:
     play: "ゲームマップへ" # The top nav bar entry where players choose which levels to play
@@ -48,9 +48,9 @@
     subscribe_as_diplomat: "Diplomat登録"

   play:
-#    play_as: "Play As" # Ladder page
-#    spectate: "Spectate" # Ladder page
-#    players: "players" # Hover over a level on /play
+    play_as: "としてプレー" # Ladder page
+    spectate: "観戦" # Ladder page
+    players: "プレーヤー" # Hover over a level on /play
     hours_played: "プレイ時間" # Hover over a level on /play
     items: "アイテム" # Tooltip on item shop button from /play
     unlock: "アンロック" # For purchasing items and heroes
@@ -69,38 +69,38 @@
     choose_inventory: "アイテムを装備"
     buy_gems: "ジェムを購入"
     subscription_required: "サブスクリプション必須"
-#    older_campaigns: "Older Campaigns"
-    anonymous: "無名プレイヤー"
+    older_campaigns: "古いキャンペーン"
+    anonymous: "名無しのプレイヤー"
     level_difficulty: "難易度: "
     campaign_beginner: "初心者のキャンペーン"
     awaiting_levels_adventurer_prefix: "私たちは週に5つのレベルをリリースします"
-    awaiting_levels_adventurer: "冒険者として登録"
-#    awaiting_levels_adventurer_suffix: "to be the first to play new levels."
+    awaiting_levels_adventurer: "冒険者として登録すると、"
+    awaiting_levels_adventurer_suffix: "新たなレベルを最初に遊ぶ事ができます"
     adjust_volume: "音量を調整する"
     choose_your_level: "レベル選択" # The rest of this section is the old play view at /play-old and isn't very important.
     adventurer_prefix: "別のレベルに移動することができます。レベルについて議論するにはこちら: "
     adventurer_forum: "冒険者の掲示板"
-#    adventurer_suffix: "."
-#    campaign_old_beginner: "Old Beginner Campaign"
+    adventurer_suffix: "。"
+    campaign_old_beginner: "旧初級キャンペーン"
     campaign_old_beginner_description: "プログラミングの魔法を学びましょう"
-    campaign_dev: "いろんな難しいレベル"
-#    campaign_dev_description: "... in which you learn the interface while doing something a little harder."
-    campaign_multiplayer: "マルチプレイ・アリーナ"
-#    campaign_multiplayer_description: "... in which you code head-to-head against other players."
-#    campaign_player_created: "Player-Created"
-#    campaign_player_created_description: "... in which you battle against the creativity of your fellow Artisan Wizards."
-#    campaign_classic_algorithms: "Classic Algorithms"
-#    campaign_classic_algorithms_description: "... in which you learn the most popular algorithms in Computer Science."
-
-#  share_progress_modal:
-#    blurb: "You’re making great progress! Tell someone how much you've learned with CodeCombat."
-#    email_invalid: "Email address invalid."
-#    form_blurb: "Enter their email below and we’ll show them!"
-#    form_label: "Email Address"
-#    placeholder: "email address"
-#    title: "Excellent Work, Apprentice"
-#    tell_friend: "Tell your Friend"
-#    tell_parent: "Tell your Parent"
+    campaign_dev: "いろんな難しいレベルを"
+    campaign_dev_description: "遊びながらインタフェースを学ぼう"
+    campaign_multiplayer: "マルチプレイ・アリーナでは、"
+    campaign_multiplayer_description: "コーディングで他のプレイヤーに対して格闘しましょう"
+    campaign_player_created: "プレイヤー作成レベルでは、"
+    campaign_player_created_description: "仲間のウィザード達の創造力との戦いに立ち向かいます"
+    campaign_classic_algorithms: "クラシックアルゴリズムでは、"
+    campaign_classic_algorithms_description: "コンピュータサイエンスの中で最も人気のあるアルゴリズムを学ぼう"
+
+  share_progress_modal:
+    blurb: "あなたは進歩している！ CodeCombatでどんなに学んだかについて、誰かに伝えてください。"
+    email_invalid: "メールアドレスが無効です"
+    form_blurb: "下にメールアドレスを入力してください"
+    form_label: "メールアドレス"
+    placeholder: "メールアドレス"
+    title: "良くやった、弟子よ"
+    tell_friend: "友達に紹介"
+    tell_parent: "親に紹介"

   login:
     sign_up: "アカウント登録"
@@ -111,7 +111,7 @@
     authenticate_gplus: "Google+を認証する"
     load_profile: "Google+プロフィールをロード"
     load_email: "Google+メールをロード"
-#    finishing: "Finishing"
+    finishing: "仕上げ中"
     sign_in_with_facebook: "Facebookでログイン"
     sign_in_with_gplus: "Google+でログイン"
     signup_switch: "アカウントを作成しますか？"
@@ -139,8 +139,8 @@
     books: "書物"

   common:
-#    back: "Back" # When used as an action verb, like "Navigate backward"
-#    continue: "Continue" # When used as an action verb, like "Continue forward"
+    back: "戻る" # When used as an action verb, like "Navigate backward"
+    continue: "次へ" # When used as an action verb, like "Continue forward"
     loading: "ロード中"
     saving: "セーブ中..."
     sending: "送信中..."
@@ -150,16 +150,16 @@
     publish: "発行"
     create: "作成"
     manual: "手動"
-#    fork: "Fork"
+    fork: "分かれ"
     play: "ゲームスタート" # When used as an action verb, like "Play next level"
     retry: "リトライ"
-#    actions: "Actions"
-#    info: "Info"
-#    help: "Help"
-#    watch: "Watch"
-#    unwatch: "Unwatch"
-#    submit_patch: "Submit Patch"
-#    submit_changes: "Submit Changes"
+    actions: "アクション"
+    info: "情報"
+    help: "ヘルプ"
+    watch: "見る"
+    unwatch: "見ない"
+    submit_patch: "パッチを送信"
+    submit_changes: "変更を送信"

   general:
     and: "と"
@@ -204,7 +204,7 @@
     medium: "ミディアム"
     hard: "ハード"
     player: "プレイヤー"
-    player_level: "プレーヤレベル" # Like player level 5, not like level: Dungeons of Kithgard
+    player_level: "プレイヤーレベル" # Like player level 5, not like level: Dungeons of Kithgard
     warrior: "戦士"
     ranger: "レンジャー"
     wizard: "ウィザード"
@@ -239,7 +239,7 @@
     success: "成功！"
     incomplete: "不完全"
     timed_out: "時間切れ"
-#    failing: "Failing"
+    failing: "失敗中"
     action_timeline: "アクション・タイムライン"
     click_to_select: "ユニットを左クリックで選択してください"
     control_bar_multiplayer: "マルチプレイ"
@@ -249,7 +249,7 @@
     reload_really: "レベルをリセットします。よろしいですか？"
     reload_confirm: "リセットする"
     victory: "勝利"
-#    victory_title_prefix: ""
+    victory_title_prefix: ""
     victory_title_suffix: "クリア"
     victory_sign_up: "進行状況をセーブするにはアカウント登録をしてください"
     victory_sign_up_poke: "あなたのコードをセーブしてみませんか? 無料アカウント登録!"
@@ -267,76 +267,76 @@
     tome_minion_spells: "操作できるキャラクターの呪文" # Only in old-style levels.
     tome_read_only_spells: "読込専用の呪文" # Only in old-style levels.
     tome_other_units: "その他のユニット" # Only in old-style levels.
-#    tome_cast_button_run: "Run"
-#    tome_cast_button_running: "Running"
-#    tome_cast_button_ran: "Ran"
-#    tome_submit_button: "Submit"
-#    tome_reload_method: "Reload original code for this method" # Title text for individual method reload button.
-#    tome_select_method: "Select a Method"
-#    tome_see_all_methods: "See all methods you can edit" # Title text for method list selector (shown when there are multiple programmable methdos).
+    tome_cast_button_run: "実行"
+    tome_cast_button_running: "実行中"
+    tome_cast_button_ran: "実行済み"
+    tome_submit_button: "送信"
+    tome_reload_method: "このメソッドの元のコードをリロードする" # Title text for individual method reload button.
+    tome_select_method: "メソッドの選択"
+    tome_see_all_methods: "編集できるすべてのメソッドをを見る" # Title text for method list selector (shown when there are multiple programmable methdos).
     tome_select_a_thang: "誰かを選択: "
     tome_available_spells: "利用できる呪文"
-#    tome_your_skills: "Your Skills"
-#    tome_help: "Help"
-#    tome_current_method: "Current Method"
+    tome_your_skills: "あなたのスキル"
+    tome_help: "ヘルプ"
+    tome_current_method: "現在のメソッド"
     hud_continue_short: "コンテニュー"
     code_saved: "コードがセーブされました"
     skip_tutorial: "スキップ (esc)"
-#    keyboard_shortcuts: "Key Shortcuts"
-#    loading_ready: "Ready!"
-#    loading_start: "Start Level"
-#    problem_alert_title: "Fix Your Code"
-#    problem_alert_help: "Help"
-#    time_current: "Now:"
-#    time_total: "Max:"
-#    time_goto: "Go to:"
-#    infinite_loop_try_again: "Try Again"
-#    infinite_loop_reset_level: "Reset Level"
-#    infinite_loop_comment_out: "Comment Out My Code"
-#    tip_toggle_play: "Toggle play/paused with Ctrl+P."
-#    tip_scrub_shortcut: "Ctrl+[ and Ctrl+] rewind and fast-forward."
-#    tip_guide_exists: "Click the guide, inside game menu (at the top of the page), for useful info."
-#    tip_open_source: "CodeCombat is 100% open source!"
-#    tip_beta_launch: "CodeCombat launched its beta in October, 2013."
-#    tip_think_solution: "Think of the solution, not the problem."
-#    tip_theory_practice: "In theory, there is no difference between theory and practice. But in practice, there is. - Yogi Berra"
-#    tip_error_free: "There are two ways to write error-free programs; only the third one works. - Alan Perlis"
-#    tip_debugging_program: "If debugging is the process of removing bugs, then programming must be the process of putting them in. - Edsger W. Dijkstra"
-#    tip_forums: "Head over to the forums and tell us what you think!"
-#    tip_baby_coders: "In the future, even babies will be Archmages."
-#    tip_morale_improves: "Loading will continue until morale improves."
-#    tip_all_species: "We believe in equal opportunities to learn programming for all species."
-#    tip_reticulating: "Reticulating spines."
-#    tip_harry: "Yer a Wizard, "
-#    tip_great_responsibility: "With great coding skill comes great debug responsibility."
-#    tip_munchkin: "If you don't eat your vegetables, a munchkin will come after you while you're asleep."
-#    tip_binary: "There are only 10 types of people in the world: those who understand binary, and those who don't."
-#    tip_commitment_yoda: "A programmer must have the deepest commitment, the most serious mind. ~ Yoda"
-#    tip_no_try: "Do. Or do not. There is no try. - Yoda"
-#    tip_patience: "Patience you must have, young Padawan. - Yoda"
-#    tip_documented_bug: "A documented bug is not a bug; it is a feature."
-#    tip_impossible: "It always seems impossible until it's done. - Nelson Mandela"
-#    tip_talk_is_cheap: "Talk is cheap. Show me the code. - Linus Torvalds"
-#    tip_first_language: "The most disastrous thing that you can ever learn is your first programming language. - Alan Kay"
-#    tip_hardware_problem: "Q: How many programmers does it take to change a light bulb?  A: None, it's a hardware problem."
-#    tip_hofstadters_law: "Hofstadter's Law: It always takes longer than you expect, even when you take into account Hofstadter's Law."
-#    tip_premature_optimization: "Premature optimization is the root of all evil. - Donald Knuth"
-#    tip_brute_force: "When in doubt, use brute force. - Ken Thompson"
-#    tip_extrapolation: "There are only two kinds of people: those that can extrapolate from incomplete data..."
-#    tip_superpower: "Coding is the closest thing we have to a superpower."
-#    tip_control_destiny: "In real open source, you have the right to control your own destiny. - Linus Torvalds"
-#    tip_no_code: "No code is faster than no code."
-#    tip_code_never_lies: "Code never lies, comments sometimes do. — Ron Jeffries"
-#    tip_reusable_software: "Before software can be reusable it first has to be usable."
-#    tip_optimization_operator: "Every language has an optimization operator. In most languages that operator is ‘//’"
-#    tip_lines_of_code: "Measuring programming progress by lines of code is like measuring aircraft building progress by weight. — Bill Gates"
-#    tip_source_code: "I want to change the world but they would not give me the source code."
-#    tip_javascript_java: "Java is to JavaScript what Car is to Carpet. - Chris Heilmann"
-#    tip_move_forward: "Whatever you do, keep moving forward. - Martin Luther King Jr."
-#    tip_google: "Have a problem you can't solve? Google it!"
-#    tip_adding_evil: "Adding a pinch of evil."
-#    tip_miss_lunch: "Anyone who has lost track of time when using a computer knows the propensity to dream, the urge to make dreams come true and the tendency to miss lunch. - Tim Berners-Lee"
-#    tip_hate_computers: "That's the thing about people who think they hate computers. What they really hate is lousy programmers. - Larry Niven"
+    keyboard_shortcuts: "キーショートカット"
+    loading_ready: "準備完了！"
+    loading_start: "レベルスタート"
+    problem_alert_title: "コードを修正して下さい"
+    problem_alert_help: "ヘルプ"
+    time_current: "今："
+    time_total: "最大："
+    time_goto: "行く："
+    infinite_loop_try_again: "再試行する"
+    infinite_loop_reset_level: "レベルをリセット"
+    infinite_loop_comment_out: "マイコードをコメントアウト"
+    tip_toggle_play: "Ctrl+Pで、プレイ／ポーズをトグルする"
+    tip_scrub_shortcut: "Ctrl+[ と Ctrl+] で巻き戻し、早送りする"
+    tip_guide_exists: "ゲームメニュー内のガイド（ページの上部）をクリックし、便利な情報 を見よう。"
+    tip_open_source: "CodeCombatは、100％オープンソースです！"
+    tip_beta_launch: "CodeCombatは、2013年10月にベータ版を開始しました。"
+    tip_think_solution: "問題より、解決策を考えろ。"
+    tip_theory_practice: "理論的には、理論と実践の間には違いはない。でも実際には、ある。- ヨギ・ベラ"
+    tip_error_free: "エラーのないプログラムを書くためには二つの方法がある：第三の方法だけ働く。-アラン・パリス"
+    tip_debugging_program: "デバッグがバグを除去するプロセスならば、プログラミングはバグを書き入れるプロセスだ。- エドガー•ダイクストラ"
+    tip_forums: "フォーラムで、あなたのご意見をお聞かせください！"
+    tip_baby_coders: "将来的には、赤ちゃんでもアークメイジになれる。"
+    tip_morale_improves: "士気が向上するまで、ローディングは続く。"
+    tip_all_species: "我々は、全ての種族が機会均等のもとでプログラミングを学べることを信じている。"
+    tip_reticulating: "網状化する背骨"
+    tip_harry: "君はウィザードだ"
+    tip_great_responsibility: "偉大なコーディングスキルを持つと、偉大なデバッグ責任も付属してきます。"
+    tip_munchkin: "野菜を食べなければ、眠ってる間、マンチキンに襲われるぞ。"
+    tip_binary: "世界には10種類の人がいる：バイナリを理解する人と、そうでない人。"
+    tip_commitment_yoda: "プログラマは、最も深いコミットメントを持つ必要がある, 最も深刻な心。 - ヨーダ"
+    tip_no_try: "やる。又はやらない。試しはない。- ヨーダ"
+    tip_patience: "持つ必要がある、忍耐を若いパダワンよ。 - ヨーダ"
+    tip_documented_bug: "文書化されたバグはバグではありません。それは機能です。"
+    tip_impossible: "何かをやり遂げるまでは、常にそれが不可能に思える。- ネルソン・マンデラ"
+    tip_talk_is_cheap: "話合はもう良い。コードを見せろ。- リーナス・トーバルズ"
+    tip_first_language: "最初のプログラミング言語を学ぶ時が、最も悲惨な事を学ぶ時だ。- アラン・ケイ"
+    tip_hardware_problem: "Q：電球を変更するのにプログラマが何人必要ですか？ A ：一人もいらない、それはハードウェアの問題だ。"
+    tip_hofstadters_law: "ホフスタッターの法則：いつでも予測以上の時間がかかるものである — ホフスタッターの法則を計算に入れても。"
+    tip_premature_optimization: "早すぎる最適化は諸悪の根源である。-ドナルド・クヌース"
+    tip_brute_force: "疑わしい時は、暴力を使え。- ケン・トンプソン"
+    tip_extrapolation: "人々は二種類存在する：不完全なデータから外挿する事が出来る者..."
+    tip_superpower: "コーディングは、私達のスーパーパワーに最も近い物"
+    tip_control_destiny: "本当のオープンソースでは、自分自身の運命をコントロールする権利を持っている。- リーナス・トーバルズ"
+    tip_no_code: "コードがないから、コードがない事の方が速い。"
+    tip_code_never_lies: "コードは決して嘘をつかない、コメントは時々嘘をつく。- ロン・ジェフリーズ"
+    tip_reusable_software: "ソフトウェアを再利用できる前には、最初に使用可能である事が必要である。"
+    tip_optimization_operator: "すべての言語は、最適化演算子を持っている。殆どの言語では、その演算子は‘//’"
+    tip_lines_of_code: "コードのライン数でプログラミングの進捗状況を測定するは、重量で航空機の設計の進捗状況を測定するみたいな事だ。- ビル・ゲイツ"
+    tip_source_code: "私は世界を変えたい、でも彼らは私にソースコードを与えてはくれない。"
+    tip_javascript_java: "カー (車）は「カー」ペットにある用にJavaは「Java」Scriptにもある。- クリス・ハイルマン"
+    tip_move_forward: "何をするにしても、前進し続けること。- マーティン・ルーサー・キング・ジュニア"
+    tip_google: "解決できない問題がありますか？ググっちゃえ！"
+    tip_adding_evil: "悪を少々加える。"
+    tip_miss_lunch: "コンピュータ使用中に時間を忘れた事のある人は夢見ることを知っている、夢を実現するために昼食を食べ忘れる傾向がある。- ティム・バーナーズリー"
+    tip_hate_computers: "コンピュータを憎むと思う人についての事だ。彼らが本当に嫌いなのは下手なプログラマーだ。- ラリー・ニーヴン"

   game_menu:
     inventory_tab: "インベントリー"
@@ -355,19 +355,19 @@
     multiplayer_caption: "友達とプレイ！"
     auth_caption: "進行状況をセーブする"

-#  leaderboard:
-#    leaderboard: "Leaderboard"
-#    view_other_solutions: "View Other Solutions"
-#    scores: "Scores"
-#    top_players: "Top Players by"
-#    day: "Today"
-#    week: "This Week"
-#    all: "All-Time"
-#    time: "Time"
-#    damage_taken: "Damage Taken"
-#    damage_dealt: "Damage Dealt"
-#    difficulty: "Difficulty"
-#    gold_collected: "Gold Collected"
+  leaderboard:
+    leaderboard: "リーダーボード"
+    view_other_solutions: "他のソリューションを見る"
+    scores: "スコア"
+    top_players: "上位プレイヤー順"
+    day: "今日"
+    week: "今週"
+    all: "オールタイム"
+    time: "時間"
+    damage_taken: "受けたダメージ"
+    damage_dealt: "与えたダメージ"
+    difficulty: "難易度"
+    gold_collected: "集めたゴールド"

   inventory:
     choose_inventory: "アイテムを装備"
@@ -393,7 +393,7 @@
     prompt_body: "もっと購入しますか？"
     prompt_button: "ショップに入る"
     recovered: "前のジェム購入をリカバリーしました。ページを更新してください。"
-#    or_subscribe: "Or 3500 gems/mo if you..."
+    or_subscribe: "または毎月3500の ジェムを..."

 #  subscribe:
 #    comparison_blurb: "Sharpen your skills with a CodeCombat subscription!"
@@ -461,7 +461,7 @@
     restricted_to_certain_heroes: "特定のヒーローのみ、このレベルをプレイする事が出来ます。"

   skill_docs:
-#    writable: "writable" # Hover over "attack" in Your Skills while playing a level to see most of this
+    writable: "書き込み可能な" # Hover over "attack" in Your Skills while playing a level to see most of this
     read_only: "リードオンリー"
     action_name: "ネーム"
     action_cooldown: "テイク"
@@ -472,11 +472,11 @@
     action_duration: "デュレーション"
     example: "例"
     ex: "例" # Abbreviation of "example"
-#    current_value: "Current Value"
-#    default_value: "Default value"
+    current_value: "現在値"
+    default_value: "デフォルト値"
     parameters: "パラメータ"
     returns: "リターン"
-#    granted_by: "Granted by"
+    granted_by: "によって与えられた"

   save_load:
     granularity_saved_games: "セーブされました"


Improve translation, add infinite loop

Improve translation, add infinite loop

Better translation of "comment out" phrase and correct translation of "rewind and fast-forward".

--- app/locale/uk.coffee
+++ app/locale/uk.coffee
@@ -294,14 +294,14 @@
     time_goto: "Перейти до:"
     non_user_code_problem_title: "Не вдається завантажити рівень"
     infinite_loop_title: "Виявлено вічний цикл"
-#    infinite_loop_description: "The initial code to build the world never finished running. It's probably either really slow or has an infinite loop. Or there might be a bug. You can either try running this code again or reset the code to the default state. If that doesn't fix it, please let us know."
+    infinite_loop_description: "Вихідний код побудови середовища не закінчив роботи. Певно він дуже повільний або містить вічний цикл. Або там може бути баґ. Ви можете запустити цей код заново або ж перезавантажити код у стан за замовчуванням. Якщо це не допомагає, будьте ласкаві, повідомте нас."
     check_dev_console: "Ви також можете відкрити консоль розробника аби перевірити що ж там твориться."
     check_dev_console_link: "(інструкції)"
     infinite_loop_try_again: "Спробувати ще раз"
     infinite_loop_reset_level: "Почати рівень спочатку"
-    infinite_loop_comment_out: "Прокоментуй мій код"
+    infinite_loop_comment_out: "Закоментувати мій код"
     tip_toggle_play: "Перемикай між грою та паузою командою Ctrl+P."
-    tip_scrub_shortcut: "Ctrl+[ і Ctrl+] для перемотування та швидкого перемотування вперед." # {change}
+    tip_scrub_shortcut: "Ctrl+[ і Ctrl+] для перемотування назад та вперед."
     tip_guide_exists: "Натисніть на Інструкцію вгорі сторінки, аби отримати корисну інформацію."
     tip_open_source: "CodeCombat є абсолютно відкритим програмним забезпеченням!"
     tip_beta_launch: "Бета-версія CodeCombat вийшла в жовтні 2013."


bits: Add getHexdump()

bits: Add getHexdump()

--- bits.coffee
+++ bits.coffee
@@ -474,7 +474,7 @@
     if col isnt 0
       console.log()

-  @hexdump: (buffer) ->
+  @getHexdump: (buffer) ->
     col = 0
     strline = ''
     dump = ''
@@ -504,7 +504,10 @@
     if col isnt 0
       endline()

-    process.stdout.write dump
+    return dump
+
+  @hexdump: (buffer) ->
+    process.stdout.write Bits.getHexdump buffer

   @zeropad: (width, num) ->
     num += ''


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


Update configuration

Update configuration


spec: comment out fragile CustomList coffeescript specs

Change-Id: Ie9ec26bf9ff2ecc7629f6967d80e277873b652b6
Reviewed-on: https://gerrit.instructure.com/28218
Tested-by: Bryan Madsen <0a3ba1af216659500dd8f41e29f3979f42452870@instructure.com>
Reviewed-by: Bryan Madsen <0a3ba1af216659500dd8f41e29f3979f42452870@instructure.com>
QA-Review: Bryan Madsen <0a3ba1af216659500dd8f41e29f3979f42452870@instructure.com>
Product-Review: Bryan Madsen <0a3ba1af216659500dd8f41e29f3979f42452870@instructure.com>

--- spec/coffeescripts/CustomListSpec.coffee
+++ spec/coffeescripts/CustomListSpec.coffee
@@ -144,23 +144,23 @@
     @clock.tick 1
     equal @list.wrapper.is(':visible'), true, 'displays on open'

-  test 'should remove and add the first item', ->
-    # store original length to compare to later
-    originalLength = @list.pinned.length
-
-    # click an element to remove it from the list
-    $(@lis[0]).simulate('click')
-
-    # this next click should get ignored because the previous element is animating
-    $(@lis[1]).simulate('click')
-
-    @clock.tick 300
-    expectedLength = originalLength - 1
-    equal @list.pinned.length, expectedLength, 'only one item should have been removed'
-
-    $(@lis[0]).simulate('click')
-    @clock.tick 300
-    equal @list.pinned.length, originalLength, 'item should be restored'
+#  test 'should remove and add the first item', ->
+#    # store original length to compare to later
+#    originalLength = @list.pinned.length
+#
+#    # click an element to remove it from the list
+#    $(@lis[0]).simulate('click')
+#
+#    # this next click should get ignored because the previous element is animating
+#    $(@lis[1]).simulate('click')
+#
+#    @clock.tick 300
+#    expectedLength = originalLength - 1
+#    equal @list.pinned.length, expectedLength, 'only one item should have been removed'
+#
+#    $(@lis[0]).simulate('click')
+#    @clock.tick 300
+#    equal @list.pinned.length, originalLength, 'item should be restored'

   test 'should cancel pending add request on remove', ->
     # Add one that doesn't exist
@@ -186,13 +186,13 @@
     @clock.tick 300
     equal @list.requests.remove[0], undefined, 'delete "remove" request'

-  test 'should reset', ->
-    originalLength = @list.targetList.children().length
-    $(@lis[0]).simulate('click')
-    @clock.tick 300
-    ok originalLength isnt @list.targetList.children().length, 'length should be different'
+#  test 'should reset', ->
+#    originalLength = @list.targetList.children().length
+#    $(@lis[0]).simulate('click')
+#    @clock.tick 300
+#    ok originalLength isnt @list.targetList.children().length, 'length should be different'
+#
+#    @list.reset()
+#    length = @list.targetList.children().length
+#    equal length, originalLength, 'targetList items restored'

-    @list.reset()
-    length = @list.targetList.children().length
-    equal length, originalLength, 'targetList items restored'
-


Redirect to login on error getting account info for manageAccount

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/mstojcevich/Lambda-Python.git/'


unbelievable

unbelievable

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

--- scripts/nurf.coffee
+++ scripts/nurf.coffee
@@ -0,0 +1,13 @@
+nurfs = [
+        "http://giant.gfycat.com/ScornfulSmugBurro.gif",
+        "http://fat.gfycat.com/GrouchyMintyEuropeanfiresalamander.gif",
+        "http://fat.gfycat.com/GrandPalatableBobwhite.gif",
+        "http://fat.gfycat.com/ReadyGlaringGermanshepherd.gif",
+        "http://i.imgur.com/ASVymEl.gif",
+]
+
+module.exports = (robot) ->
+  robot.hear /(unbelievable|inconceivable|wait what)/i, (msg) ->
+    msg.send msg.random nurfs
+
+


공백 관련 이슈 TEST

공백 관련 이슈 TEST

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


Updated shortcut

Updated shortcut

--- keymaps/toolbar.cson
+++ keymaps/toolbar.cson
@@ -8,4 +8,4 @@
 # For more detailed documentation see
 # https://atom.io/docs/latest/advanced/keymaps
 '.workspace':
-  'ctrl-alt-o': 'toolbar:toggle'
+  'ctrl-alt-t': 'toolbar:toggle'


add flip script

add flip script

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

--- scripts/flip.coffee
+++ scripts/flip.coffee
@@ -0,0 +1,50 @@
+# Description:
+#   When things aren't going well, you must flip it. (╯°□°）╯︵ ʇoqnɥ
+#
+# Dependencies:
+#   "flip": "~0.1.0"
+#
+# Commands:
+#   hubot flip <text> - express your anger
+#   hubot rage flip <text> - express your anger with rage
+#   hubot unflip <text>
+#
+# Authors:
+#   jergason
+#   spajus
+
+flip = require 'flip'
+
+module.exports = (robot) ->
+
+  robot.respond /(rage )?flip( .*)?$/i, (msg) ->
+    if msg.match[1] == 'rage '
+      guy = '(ノಠ益ಠ)ノ彡'
+    else
+      guy = '(╯°□°）╯︵'
+
+    toFlip = (msg.match[2] || '').trim()
+
+    if toFlip == 'me'
+      toFlip = msg.message.user.name
+
+    if toFlip == ''
+      flipped = '┻━┻'
+    else
+      flipped = flip(toFlip)
+
+    msg.send "#{guy} #{flipped}"
+
+
+  robot.respond /unflip( .*)?$/i, (msg) ->
+    toUnflip = (msg.match[1] || '').trim()
+
+    if toUnflip == 'me'
+      unflipped = msg.message.user.name
+    else if toUnflip == ''
+      unflipped = '┬──┬'
+    else
+      unflipped = toUnflip
+
+    msg.send "#{unflipped} ノ( º _ ºノ)"
+


stub render tests

stub render tests

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

--- src/test/test_render.coffee
+++ src/test/test_render.coffee
@@ -0,0 +1,47 @@
+{god} = require '../god'
+{layout} = require '../layout'
+{render} = require '../layout/render'
+
+{rx_mock}= require './rx_mock'
+
+
+svg_dict = {
+  size: 480
+  scale: 80
+  fill: "green"
+  stroke: "black"
+  path: "M0,0 L100,100"
+}
+
+exports.test_render = (test, rx) ->
+
+  render_dict = (dict) ->
+    world = god(rx_mock(rx), dict)
+    render(world)
+
+  test "rx_mock exists", (t) ->
+    result = render_dict({})
+    console.log result
+    t.equal result.tag, "div", "mock div"
+    t.end()
+
+  test "render root", (t) ->
+    t.end()
+
+  test "render world", (t) ->
+    t.end()
+
+  test "render children", (t) ->
+    t.end()
+
+  test "render html", (t) ->
+    # rows
+    # columns
+    # buttons
+    t.end()
+
+  test "render svg", (t) ->
+    t.end()
+
+  test "render name", (t) ->
+    t.end()


fix annyang usage on unsupported browsers

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


yaml editor component

yaml editor component

error: pathspec 'imports/ui/editors/YamlEditor.cjsx' did not match any file(s) known to git

--- imports/ui/editors/YamlEditor.cjsx
+++ imports/ui/editors/YamlEditor.cjsx
@@ -0,0 +1,47 @@
+React         = require 'react'
+jsyaml        = require 'js-yaml'
+
+{ Box } = require 'grommet'
+AceEditor = (require 'react-ace').default
+require 'brace/mode/yaml'
+require 'brace/theme/github'
+
+module.exports = React.createClass
+  displayName: 'YamlEditor'
+
+  onChange: (code) ->
+    console.log 'onChange', code
+    try
+      jsyaml.load code
+      console.log @refs.ace.editor.getSession()
+    catch error
+      session = @refs.ace.editor.session
+      line = if error.mark.line == session.doc.getAllLines().length then error.mark.line - 1 else error.mark.line
+      session.setAnnotations [
+        row: line
+        column: error.mark.column
+        text: error.reason
+        type: 'error'
+      ]
+
+
+  componentDidMount: ->
+    console.log @refs.ace
+
+  render: ->
+    <Box>
+      <AceEditor
+        ref="ace"
+        mode="yaml"
+        theme="github"
+        onChange={@onChange}
+        name="compose-editor"
+        height='calc(100vh - 147px)'
+        width='100%'
+        fontSize=16
+        value={@props.code}
+        setOptions={fixedWidthGutter:'50px'}
+        editorProps={{$blockScrolling: true}}
+        enableBasicAutocompletion=true
+      />
+    </Box>


ace/findandreplace: handle special keys manually :hamster:


Return only at end

Return only at end

--- lib/directory.coffee
+++ lib/directory.coffee
@@ -93,11 +93,10 @@
       File.createAsRoot(file: entry)

   getEntries: ->
-    return _.values(@entries) if @entries?
-
-    @entries = {}
-    for entry in @directory.getEntries() when not @isPathIgnored(entry.path)
-      entry = @createEntry(entry)
-      @entries[entry.name] = entry
+    unless @entries?
+      @entries = {}
+      for entry in @directory.getEntries() when not @isPathIgnored(entry.path)
+        entry = @createEntry(entry)
+        @entries[entry.name] = entry

     _.values(@entries)


help tweak

help tweak

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


fixes

fixes


bug fix

bug fix


travis test

travis test

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


timeout fixes

timeout fixes


loading css + js

loading css + js


unused layout var & console.log removal

unused layout var & console.log removal

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


static pages: renamed the announce channel to changelog


basic context link insertion working if messy

--- client/create.coffee
+++ client/create.coffee
@@ -45,48 +45,50 @@
     ContextLinkExtension::showContextAnchorForm = (link_value) ->
         @base.toolbarActions.style.display = 'none'; # TO-DO Keep the toolbar
         @base.saveSelection();
-        $(".context-anchor-menu").show()
-        $(".context-anchor-menu").insertAfter(@base.toolbarActions)
+        contextAnchorForm = $(".context-anchor-menu")
+        contextAnchorForm.show()
+        contextAnchorForm.insertAfter(@base.toolbarActions)
+
         # @base.contextAnchorForm.style.display = 'block';
         @base.setToolbarPosition();
         @base.keepToolbarAlive = true;
         # @base.anchorInput.focus();
         # @base.anchorInput.value = link_value || '';

-    toolbarFormContextAnchor = ->
-        anchor = document.createElement("div")
-        input = document.createElement("input")
-        target_label = document.createElement("label")
-        target = document.createElement("input")
-        button_label = document.createElement("label")
-        button = document.createElement("input")
-        close = document.createElement("a")
-        save = document.createElement("a")
-        close.setAttribute "href", "#"
-        close.className = "medium-editor-toobar-anchor-close"
-        close.innerHTML = "×"
-        save.setAttribute "href", "#"
-        save.className = "medium-editor-toobar-anchor-save"
-        save.innerHTML = "✓"
-        input.setAttribute "type", "text"
-        input.className = "medium-editor-toolbar-anchor-input"
-        # input.setAttribute "placeholder", @options.anchorInputPlaceholder
-        target.setAttribute "type", "checkbox"
-        target.className = "medium-editor-toolbar-anchor-target"
-        target_label.innerHTML = "Open in New Window?"
-        target_label.insertBefore target, target_label.firstChild
-        button.setAttribute "type", "checkbox"
-        button.className = "medium-editor-toolbar-anchor-button"
-        button_label.innerHTML = "Button"
-        button_label.insertBefore button, button_label.firstChild
-        anchor.className = "medium-editor-toolbar-form-context-anchor"
-        anchor.id = "medium-editor-toolbar-form-context-anchor"
-        anchor.appendChild input
-        anchor.appendChild save
-        anchor.appendChild close
-        # anchor.appendChild target_label  if @options.anchorTarget
-        # anchor.appendChild button_label  if @options.anchorButton
-        anchor
+    # toolbarFormContextAnchor = ->
+    #     anchor = document.createElement("div")
+    #     input = document.createElement("input")
+    #     target_label = document.createElement("label")
+    #     target = document.createElement("input")
+    #     button_label = document.createElement("label")
+    #     button = document.createElement("input")
+    #     close = document.createElement("a")
+    #     save = document.createElement("a")
+    #     close.setAttribute "href", "#"
+    #     close.className = "medium-editor-toobar-anchor-close"
+    #     close.innerHTML = "×"
+    #     save.setAttribute "href", "#"
+    #     save.className = "medium-editor-toobar-anchor-save"
+    #     save.innerHTML = "✓"
+    #     input.setAttribute "type", "text"
+    #     input.className = "medium-editor-toolbar-anchor-input"
+    #     # input.setAttribute "placeholder", @options.anchorInputPlaceholder
+    #     target.setAttribute "type", "checkbox"
+    #     target.className = "medium-editor-toolbar-anchor-target"
+    #     target_label.innerHTML = "Open in New Window?"
+    #     target_label.insertBefore target, target_label.firstChild
+    #     button.setAttribute "type", "checkbox"
+    #     button.className = "medium-editor-toolbar-anchor-button"
+    #     button_label.innerHTML = "Button"
+    #     button_label.insertBefore button, button_label.firstChild
+    #     anchor.className = "medium-editor-toolbar-form-context-anchor"
+    #     anchor.id = "medium-editor-toolbar-form-context-anchor"
+    #     anchor.appendChild input
+    #     anchor.appendChild save
+    #     anchor.appendChild close
+    #     # anchor.appendChild target_label  if @options.anchorTarget
+    #     # anchor.appendChild button_label  if @options.anchorButton
+    #     anchor
     #####
     #
     # End stuff from Medium-editor.js
@@ -99,22 +101,25 @@

     editor = new MediumEditor ".medium-editable",
-        buttons: ['contextLink', 'bold', 'italic', 'underline'],
+        buttons: ['contextLink', 'bold', 'italic', 'underline', 'anchor'],
         extensions:
             contextLink: new ContextLinkExtension()

     console.log editor.toolbar
-    editor.toolbar.appendChild(toolbarFormContextAnchor());
-
-    editor.contextAnchorForm = editor.toolbar.querySelector('.medium-editor-toolbar-form-context-anchor');
-    editor.contextAnchorForm.style.display = 'none';
+    # editor.toolbar.appendChild(toolbarFormContextAnchor());
+
+    # editor.contextAnchorForm = editor.toolbar.querySelector('.medium-editor-toolbar-form-context-anchor');
+    # editor.contextAnchorForm.style.display = 'none';
+
+
+    # console.log editor.contextAnchorForm

     # Monkey Patches !!!
     editor.showToolbarActions = ->
         self = this
         timer = undefined
         @anchorForm.style.display = "none"
-        @contextAnchorForm.style.display = "none" # This is the monkey patch
+        # @contextAnchorForm.style.display = "none" # This is the monkey patch
         @toolbarActions.style.display = "block"
         @keepToolbarAlive = false
         clearTimeout timer
@@ -124,12 +129,16 @@
         , 100)
         return

-    editor.clickingIntoArchorForm = (e) ->
-        self = this
-        if e.type and e.type.toLowerCase() is "blur" and e.relatedTarget and e.relatedTarget in [self.anchorInput, self.contextAnchorForm]
-            return true
-        else
-            return false
+    # editor.clickingIntoArchorForm = (e) ->
+    #     self = this
+    #     console.log e
+    #     # console.log e.type
+
+    #     # console.log $(self.contextAnchorForm).has(e.target)
+    #     if e.type and e.type.toLowerCase() is "blur" and e.relatedTarget and e.relatedTarget in [self.anchorInput, self.contextAnchorForm]
+    #         return true
+    #     else
+    #         return false

     # End of monkey patches

@@ -333,12 +342,16 @@
     'click img.gifgif-button': (d) -> renderTemplate(d, Template.create_gifgif_section)
     'click img.audio-button': (d) -> renderTemplate(d, Template.create_audio_section)

-Template.context_anchor_menu.events
-    'mousedown .context-anchor-option': (d) ->
-        contextId =  $(d.currentTarget).data('contextId')
+Template.context_anchor_menu.rendered = ->
+    @$('.context-anchor-option').on 'mousedown', (e) ->
+        e.preventDefault()
+        console.log 'cleeek'
+        # @keepToolbarAlive = true;
+        contextId =  $(e.currentTarget).data('contextId')
         document.execCommand('createLink', false, contextId);
-        d.preventDefault()
+        # contextAnchorForm.hide()
         return false
+

 Template.create_section_options.events
     "click div#back": (d) ->


fatal error huh?

fatal error huh?

--- apps/auctions/test/template.coffee
+++ apps/auctions/test/template.coffee
@@ -36,8 +36,11 @@
       $('.af-name').should.have.lengthOf 1
       # Past auctions
       $('.leader-dots-list-item').should.have.lengthOf 1
-      # 'How auctions work' link & Upcoming auctions
-      $('.ap-upcoming-item').should.have.lengthOf 2
+      # Upcoming auctions
+      $('.ap-upcoming-item').should.have.lengthOf 1
+      # How Auctions Work
+      $('.auction-cta-group').should.have.lengthOf 2
+

   xdescribe 'without current auctions', ->
     before (done) ->


Clean location search bar

Clean location search bar

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


Work around bug where doc list is active but its el has no parent

No idea what's going on :/

TypeError: Cannot read property 'removeChild' of null
  at HTMLDivElement.<anonymous>()
  at o.app.views.ListFold.o.onClick()
  at o.app.views.ListFold.o.toggle()
  at o.app.views.ListFold.o.close()
  at Function.$.trigger()
  at HTMLDivElement.<anonymous>()
  at o.app.views.DocList.o.onClose()
  at o.app.View.e.detach()
  at Function.$.remove()

--- assets/javascripts/lib/util.coffee
+++ assets/javascripts/lib/util.coffee
@@ -111,9 +111,9 @@

 $.remove = (value) ->
   if $.isCollection(value)
-    el.parentElement.removeChild(el) for el in $.makeArray(value)
-  else
-    value.parentElement.removeChild(value)
+    el.parentElement?.removeChild(el) for el in $.makeArray(value)
+  else
+    value.parentElement?.removeChild(value)
   return

 $.empty = (el) ->


bug fixes

bug fixes


bug fixes to update

bug fixes to update


add comment collection

add comment collection

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

--- collections/comment.coffee
+++ collections/comment.coffee
@@ -0,0 +1,8 @@
+class @Comment extends Minimongoid
+
+  @_collection: new Meteor.Collection 'post_comments'
+
+  @belongs_to: [
+    name: 'post'
+    identifier: 'postId'
+  ]


add renderComponent snippet

add renderComponent snippet

/bin/sh: 1: Syntax error: "(" unexpected


run with timeout

run with timeout

--- node_modules_koding/koding-kite/kite.coffee
+++ node_modules_koding/koding-kite/kite.coffee
@@ -203,15 +203,27 @@

         if callback
             options =
-              localKite: worker,
+              localKite: worker,
               remoteKite: null,
               method: scrubbed.method,
               args: unscrubbed[0].withArgs,
-              userName: "nobody",
+              username: "nobody",
               authentication: "null"
-            console.log options
             request = new Request options
-            callback request, unscrubbed[1]
+
+            timeoutWrapper = (timeout, fn)->
+              # if fn is not called within spesified time,
+              # calls fn with err
+              isFnCalled = false
+              setTimeout ()->
+                if not isFnCalled
+                  fn "Kite worker didnt return in time", null
+              , timeout * 1000
+              return (args...)->
+                isFnCalled = true
+                fn.apply worker, args
+
+            callback request, timeoutWrapper(2, unscrubbed[1])

 module.exports.Worker = Worker
 module.exports.Client = Client


Adding inkdrop custom keybinds for vim plugin

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

--- inkdrop_keymap.cson
+++ inkdrop_keymap.cson
@@ -0,0 +1,8 @@
+'.CodeMirror.vim-mode.insert-mode textarea':
+  'ctrl-[': 'vim:exit-insert-mode'
+  'j k': 'vim:exit-insert-mode'
+  'k j': 'vim:exit-insert-mode'
+'.CodeMirror.vim-mode.replace-mode textarea':
+  'ctrl-[': 'vim:exit-insert-mode'
+  'j k': 'vim:exit-insert-mode'
+  'k j': 'vim:exit-insert-mode'


Add the comment diff button where it should be

--- app/assets/javascripts/files_comment_button.js.coffee
+++ app/assets/javascripts/files_comment_button.js.coffee
@@ -35,8 +35,7 @@
     textFileElement = @getTextFileElement(currentTarget)
     lineHolderElement = @getLineHolder(currentTarget)
     lineContentElement = @getLineContent(currentTarget)
-    lineNumElement = @getLineNum(currentTarget)
-    buttonParentElement = lineNumElement
+    buttonParentElement = @getButtonParent(currentTarget)

     return if not @shouldRender e, buttonParentElement

@@ -55,7 +54,7 @@

   destroy: (e) =>
     return if @isMovingToSameType e
-    $(@COMMENT_BUTTON_CLASS, @getLineNum $(e.currentTarget)).remove()
+    $(@COMMENT_BUTTON_CLASS, @getButtonParent $(e.currentTarget)).remove()
     return

   buildButton: (buttonAttributes) ->
@@ -75,23 +74,25 @@
     return hoveredElement if hoveredElement.hasClass @LINE_HOLDER_CLASS
     $(hoveredElement.parent())

-  getLineNum: (hoveredElement) ->
-    if @VIEW_TYPE is 'inline' and hoveredElement.hasClass @OLD_LINE_CLASS
-      $(hoveredElement).next ".#{@LINE_NUMBER_CLASS}"
-    else if hoveredElement.hasClass @LINE_NUMBER_CLASS
-      hoveredElement
-    else
-      $(hoveredElement).prev ".#{@LINE_NUMBER_CLASS}"
-
   getLineContent: (hoveredElement) ->
     return hoveredElement if hoveredElement.hasClass @LINE_CONTENT_CLASS

     $(hoveredElement).next ".#{@LINE_CONTENT_CLASS}"

+  getButtonParent: (hoveredElement) ->
+    if @VIEW_TYPE is 'inline'
+      return hoveredElement if hoveredElement.hasClass @OLD_LINE_CLASS
+
+      $(hoveredElement).parent().find ".#{@OLD_LINE_CLASS}"
+    else
+      return hoveredElement if hoveredElement.hasClass @LINE_NUMBER_CLASS
+
+      $(hoveredElement).prev ".#{@LINE_NUMBER_CLASS}"
+
   isMovingToSameType: (e) ->
-    newLineNum = @getLineNum($(e.toElement))
-    return false unless newLineNum
-    (newLineNum).is @getLineNum($(e.currentTarget))
+    newButtonParent = @getButtonParent($(e.toElement))
+    return false unless newButtonParent
+    (newButtonParent).is @getButtonParent($(e.currentTarget))

   shouldRender: (e, buttonParentElement) ->
     (!buttonParentElement.hasClass(@EMPTY_CELL_CLASS) and \


Put back hiding of modal

Put back hiding of modal

--- app/assets/javascripts/merge_request_widget.js.coffee
+++ app/assets/javascripts/merge_request_widget.js.coffee
@@ -7,6 +7,7 @@
   #

   constructor: (@opts) ->
+    $('#modal_merge_info').modal(show: false)
     @firstCICheck = true
     @readyForCICheck = true
     clearInterval @fetchBuildStatusInterval


Add settings to load

Add settings to load


Query class

Query class

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

--- queries/query.coffee
+++ queries/query.coffee
@@ -0,0 +1,23 @@
+mysql = require "mysql"
+db = require "../config/db"
+
+class Query
+
+  constructor: (options={}) ->
+    @connection = mysql.createConnection db
+    @connection.connect()
+    @query = options.body or "SELECT 'this is the default query. pass a query body' FROM dual"
+
+  run: (done) ->
+    @connection.query @query, (err, rows, fields) =>
+      console.log "err: ", err
+      console.log "rows: ", rows
+      console.log "fields: ", fields
+      if err?
+        done err
+      else
+        done rows
+
+      @connection.end()
+
+module.exports = Query


change check to use number

change check to use number

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


Tweaked SpriteParser to be smarter about finding root MovieClips and shifting their bounds.

--- app/lib/sprites/SpriteParser.coffee
+++ app/lib/sprites/SpriteParser.coffee
@@ -37,14 +37,7 @@
     blocks = @findBlocks ast, source
     containers = _.filter blocks, {kind: 'Container'}
     movieClips = _.filter blocks, {kind: 'MovieClip'}
-    if movieClips.length
-      # First movie clip is root, so do it last
-      movieClips = movieClips[1 ... movieClips.length].concat([movieClips[0]])
-
-    # first container isn't necessarily root... actually the last one is root in blue-cart
-#    else if containers.length
-#      # First container is root, so do it last
-#      containers = containers[1 ... containers.length].concat([containers[0]])
+
     mainClip = _.last(movieClips) ? _.last(containers)
     @animationName = mainClip.name
     for container, index in containers
@@ -69,17 +62,24 @@
             break
       continue unless container.bounds and instructions.length
       @addContainer {c: instructions, b: container.bounds}, container.name
+
+    childrenMovieClips = []
+
     for movieClip, index in movieClips
-      if index is 0
-        for bounds in movieClip.frameBounds
-          bounds[0] -= @width / 2
-          bounds[1] -= @height / 2
-        movieClip.bounds[0] -= @width / 2
-        movieClip.bounds[1] -= @height / 2
+      lastBounds = null
+      # fill in bounds which are null...
+      for bounds, boundsIndex in movieClip.frameBounds
+        if not bounds
+          movieClip.frameBounds[boundsIndex] = _.clone(lastBounds)
+        else
+          lastBounds = bounds
+
       localGraphics = @getGraphicsFromBlock(movieClip, source)
       [shapeKeys, localShapes] = @getShapesFromBlock movieClip, source
       localContainers = @getContainersFromMovieClip movieClip, source, true
       localAnimations = @getAnimationsFromMovieClip movieClip, source, true
+      for animation in localAnimations
+        childrenMovieClips.push(animation.gn)
       localTweens = @getTweensFromMovieClip movieClip, source, localShapes, localContainers, localAnimations
       @addAnimation {
         shapes: localShapes
@@ -90,6 +90,14 @@
         bounds: movieClip.bounds
         frameBounds: movieClip.frameBounds
       }, movieClip.name
+
+    for movieClip in movieClips
+      if movieClip.name not in childrenMovieClips
+        for bounds in movieClip.frameBounds
+          bounds[0] -= @width / 2
+          bounds[1] -= @height / 2
+        movieClip.bounds[0] -= @width / 2
+        movieClip.bounds[1] -= @height / 2

     @saveToModel()
     return movieClips[0]?.name


Improved the LayerAdapter to more accurately adjust its size downward if it renders a spritesheet, handle when a single thang is too large, and cancels in-progress async builds if a new one starts.

--- app/lib/surface/LayerAdapter.coffee
+++ app/lib/surface/LayerAdapter.coffee
@@ -222,6 +222,8 @@
     @_renderNewSpriteSheet()

   _renderNewSpriteSheet: (async) ->
+    @asyncBuilder.stopAsync() if @asyncBuilder
+
     async ?= @buildAsync
     builder = new createjs.SpriteSheetBuilder()
     groups = _.groupBy(@toRenderBundles, ((bundle) -> @renderGroupingKey(bundle.thangType, '', bundle.colorConfig)), @)
@@ -259,8 +261,13 @@
         @renderRasterThangType(thangType, builder)

     if async
-      builder.buildAsync()
+      try
+        builder.buildAsync()
+      catch e
+        @resolutionFactor *= 0.9
+        return @_renderNewSpriteSheet(async)
       builder.on 'complete', @onBuildSpriteSheetComplete, @, true, builder
+      @asyncBuilder = builder
     else
       sheet = builder.build()
       @onBuildSpriteSheetComplete({async:async}, builder)
@@ -268,10 +275,14 @@

   onBuildSpriteSheetComplete: (e, builder) ->
     return if @initializing
+    @asyncBuilder = null

     if builder.spriteSheet._images.length > 1
-      @resolutionFactor *= 0.9
-      console.debug('Sprite sheet is too large... re-rendering at', @resolutionFactor.toFixed(2))
+      total = 0
+      # get a rough estimate of how much smaller the spritesheet needs to be
+      for image, index in builder.spriteSheet._images
+        total += image.height / builder.maxHeight
+      @resolutionFactor /= (Math.max(1.1, Math.sqrt(total)))
       @_renderNewSpriteSheet(e.async)
       return


Renamed imgBgBorder -> imageBgBorderWidthArray

--- src/cropit.coffee
+++ src/cropit.coffee
@@ -39,12 +39,12 @@
     @image.crossOrigin = 'Anonymous' if @options.allowCrossOrigin

     if typeof @options.imageBackgroundBorderWidth is 'object'
-      @imgBgBorder = @options.imageBackgroundBorderWidth
+      @imageBgBorderWidthArray = @options.imageBackgroundBorderWidth
     else
-      @imgBgBorder[0] = @options.imageBackgroundBorderWidth
-      @imgBgBorder[1] = @options.imageBackgroundBorderWidth
-      @imgBgBorder[2] = @options.imageBackgroundBorderWidth
-      @imgBgBorder[3] = @options.imageBackgroundBorderWidth
+      @imageBgBorderWidthArray[0] = @options.imageBackgroundBorderWidth
+      @imageBgBorderWidthArray[1] = @options.imageBackgroundBorderWidth
+      @imageBgBorderWidthArray[2] = @options.imageBackgroundBorderWidth
+      @imageBgBorderWidthArray[3] = @options.imageBackgroundBorderWidth

     @$fileInput = @options.$fileInput
       .attr
@@ -75,12 +75,12 @@
         .css
           position: 'absolute'
           zIndex: 0
-          left: -@imgBgBorder[3] + window.parseInt @$preview.css 'border-left-width'
-          top: -@imgBgBorder[0] + window.parseInt @$preview.css 'border-top-width'
-          width: @previewSize.w + @imgBgBorder[1] + @imgBgBorder[3]
-          height: @previewSize.h + @imgBgBorder[0] + @imgBgBorder[2]
+          left: -@imageBgBorderWidthArray[3] + window.parseInt @$preview.css 'border-left-width'
+          top: -@imageBgBorderWidthArray[0] + window.parseInt @$preview.css 'border-top-width'
+          width: @previewSize.w + @imageBgBorderWidthArray[1] + @imageBgBorderWidthArray[3]
+          height: @previewSize.h + @imageBgBorderWidthArray[0] + @imageBgBorderWidthArray[2]
         .append @$imageBg
-      @$imageBgContainer.css overflow: 'hidden' if @imgBgBorder[0] > 0
+      @$imageBgContainer.css overflow: 'hidden' if @imageBgBorderWidthArray[0] > 0
       $previewContainer
         .css 'position', 'relative'
         .prepend @$imageBgContainer
@@ -218,8 +218,8 @@
     @$preview.css 'background-position', "#{@offset.x}px #{@offset.y}px"
     if @options.imageBackground
       @$imageBg.css
-        left: @offset.x + @imgBgBorder[3]
-        top: @offset.y + @imgBgBorder[0]
+        left: @offset.x + @imageBgBorderWidthArray[3]
+        top: @offset.y + @imageBgBorderWidthArray[0]

   fixOffset: (offset) ->
     return offset unless @imageLoaded
@@ -368,8 +368,8 @@

     if @options.imageBackground
       @$imageBgContainer.css
-        width: @previewSize.w + @imgBgBorder[1] + @imgBgBorder[3]
-        height: @previewSize.h + @imgBgBorder[0] + @imgBgBorder[2]
+        width: @previewSize.w + @imageBgBorderWidthArray[1] + @imageBgBorderWidthArray[3]
+        height: @previewSize.h + @imageBgBorderWidthArray[0] + @imageBgBorderWidthArray[2]

     if @imageLoaded
       @setupZoomer()


removed copied test case

removed copied test case

error: pathspec 'tests/cases/copy' did not match any file(s) known to git
error: pathspec 'of' did not match any file(s) known to git
error: pathspec 'classes.coffee' did not match any file(s) known to git


client/webpack: add config.module module

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

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


Fix bug about dummy event when exporting calendar

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


Prove that regex from earlier works.

Prove that regex from earlier works.

Note that 1d010 still works. I don't see the need of overcomplicating
when 010 is a integer.

--- scripts/dice.coffee
+++ scripts/dice.coffee
@@ -18,6 +18,9 @@
 #   https://github.com/github/hubot-scripts/blob/master/src/scripts/dice.coffee
 #   drobati
 #   Added fudge dice and modifiers.
+#
+# Regex Tests:
+#   https://regex101.com/r/mC7vQ3/3

 module.exports = (robot) ->
   robot.respond /roll (die|one)/i, (msg) ->


Point out the time limit

Point out the time limit

--- scripts/vote.coffee
+++ scripts/vote.coffee
@@ -26,7 +26,7 @@
     Vote.current = null

     if @expired
-      @msg.send "Vote failed, time's up!"
+      @msg.send "Vote failed, time's up! (#{@duration()} seconds)"
       return false

     if @votes.yes.length == @votes.no.length


[repl] Remove LuaJIT compatibility.

[repl] Remove LuaJIT compatibility.

The 5.1 parser does not like my abuse of ; to separate statements;
Re-add compatibility when @ybden's codegen work is done.

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


extracting point

extracting point

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

--- test/point.coffee
+++ test/point.coffee
@@ -0,0 +1,69 @@
+( ->
+  module "Point"
+
+  test "#add", ->
+    p1 = Point(5, 6)
+    p2 = Point(7, 5)
+
+    result = p1.add(p2)
+
+    equals result.x, p1.x + p2.x
+    equals result.y, p1.y + p2.y
+
+  test "#add two arg", ->
+    point = Point(3, 7)
+    x = 2
+    y = 1
+
+    result = point.add(x, y)
+
+    equals result.x, point.x + x
+    equals result.y, point.y + y
+
+  test "#subtract", ->
+    p1 = Point(5, 6)
+    p2 = Point(7, 5)
+
+    result = p1.subtract(p2)
+
+    equals result.x, p1.x - p2.x
+    equals result.y, p1.y - p2.y
+
+  test "#norm", ->
+    p = Point(2, 0)
+
+    normal = p.norm()
+    equals normal.x, 1
+
+    normal = p.norm(5)
+    equals normal.x, 5
+
+  test "#scale", ->
+    p1 = Point(5, 6)
+    scalar = 2
+
+    result = p1.scale(scalar)
+
+    equals result.x, p1.x * scalar
+    equals result.y, p1.y * scalar
+
+  test "#floor", ->
+    p1 = Point(7.2, 6.9)
+
+    ok Point(7, 6).equal(p1.floor())
+
+  test "#equal", ->
+    ok Point(7, 8).equal(Point(7, 8))
+
+  test "#magnitude", ->
+    equals Point(3, 4).magnitude(), 5
+
+  test ".fromAngle", ->
+    p = Point.fromAngle(Math.TAU / 4)
+
+    equalEnough p.x, 0, TOLERANCE
+    equals p.y, 1
+
+  module undefined
+)()
+


Begin docs for RackApplication

Begin docs for RackApplication

--- src/rack_application.coffee
+++ src/rack_application.coffee
@@ -1,3 +1,24 @@
+# The `RackApplication` class is responsible for managing a
+# [Nack](http://josh.github.com/nack/) server for a given Rack
+# application. Incoming HTTP requests are dispatched to
+# `RackApplication` instances by an `HttpServer`, where they are
+# subsequently handled by a pool of Nack worker processes. By default,
+# Pow tells Nack to use a maximum of two worker processes per
+# application, but this can be overridden with the configuration's
+# `workers` option.
+#
+# Before creating the Nack server, Pow executes the `.powrc` and
+# `.powenv` scripts if they're present in the application root,
+# captures their environment variables, and passes them along to the
+# Nack worker processes. This lets you modify your `PATH` to use a
+# different Ruby version, for example.
+#
+# Nack workers remain running until they're killed, restarted (by
+# touching the `tmp/restart.txt` file in the application root), or
+# until the application has not served requests for the length of time
+# specified in the configuration's `timeout` option (15 minutes by
+# default).
+
 async = require "async"
 path  = require "path"
 fs    = require "fs"


Initial pass at a postgres brain

Initial pass at a postgres brain

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

--- src/scripts/pg-brain.coffee
+++ src/scripts/pg-brain.coffee
@@ -0,0 +1,55 @@
+# Description:
+#   Stores the brain in Postgres
+#
+# Dependencies:
+#   "pg": "~0.10.2"
+#
+# Configuration:
+#   DATABASE_URL
+#
+# Commands:
+#   None
+#
+# Notes:
+#   Run the following SQL to setup the table and column for storage.
+#
+#   CREATE TABLE hubot (
+#     id CHARACTER VARYING(1024) NOT NULL,
+#     storage TEXT,
+#     CONSTRAINT hubot_pkey PRIMARY KEY (id)
+#   )
+#   INSERT INTO hubot VALUES(1, NULL)
+#
+# Author:
+#   danthompson
+
+Postgres = require 'pg'
+
+# sets up hooks to persist the brain into postgres.
+module.exports = (robot) ->
+
+  database_url = process.env.DATABASE_URL
+
+  if !database_url?
+    throw new Error('pg-brain requires a DATABASE_URL to be set.')
+
+  client = new Postgres.Client(database_url)
+  client.connect()
+  robot.logger.debug "pg-brain connected to #{database_url}."
+
+  query = client.query("SELECT storage FROM hubot LIMIT 1")
+  query.on 'row', (row) ->
+    if row['storage']?
+      robot.brain.mergeData JSON.parse(row['storage'].toString())
+      robot.logger.debug "pg-brain loaded."
+
+  client.on "error", (err) ->
+    robot.logger.error err
+
+  robot.brain.on 'save', (data) ->
+    query = client.query("UPDATE hubot SET storage = $1", [JSON.stringify(data)])
+    robot.logger.debug "pg-brain saved."
+
+  robot.brain.on 'close', ->
+    client.end()
+