Code Monkey home page Code Monkey logo

livereload / livereload Goto Github PK

View Code? Open in Web Editor NEW
1.4K 76.0 166.0 81.12 MB

LiveReload.app for Mac and Windows. See “develop” branch for the latest Windows release and LiveReload 3 progress. (NOTE: renamed from LiveReload2.)

Home Page: http://livereload.com/

License: Other

Ruby 0.43% C 16.14% Objective-C 39.66% Swift 7.34% C++ 0.50% CoffeeScript 0.06% CSS 0.37% HTML 19.84% TypeScript 0.02% Shell 6.63% Makefile 2.14% JavaScript 1.62% Objective-C++ 0.62% C# 4.39% PowerShell 0.07% Batchfile 0.11% M4 0.05%

livereload's Introduction

LiveReload 3

LiveReload is an essential tool for web developers, and is currently the top paid developer tool on the Mac App Store in many countries.

License

Copyright 2012–2015, Andrey Tarantsov — [email protected]

Purchasing policy notice: All users of the software are expected to purchase a license from Andrey Tarantsov unless they have a good reason not to pay. Users that don't purchase a license are encouraged to apply for a free one at [email protected]. The users are free to:

  • download, build and modify the app;
  • share the modified source code;
  • share the purchased or custom-built binaries (with unmodified license and contact info), provided that the purchasing policy is explained to all potential users.

This software is available under the Open Community Indie Software License:

Permission to use, copy, modify, and/or distribute this software for any purpose is hereby granted, free of charge, subject to the following conditions:

  • all copies retain the above copyright notice, the above purchasing policy notice and this permission notice unmodified;

  • all copies retain the name of the software (LiveReload), the name of the author (Andrey Tarantsov) and the contact information (including, but not limited to, pointers to [email protected] and livereload.com URLs) unmodified;

  • no fee is charged for distibution of the software;

  • when distributing the software, the best effort is made to explain the purchasing policy to all users of the software who don't already have a license.

In the event that no new official binary releases of the software are published for two consecutive years, the above conditions are permanently waived, and the software is additionally made available under the terms of the MIT license.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

Building LiveReload for Windows

Follow windows/README.md.

Building LiveReload for Mac

Note: right now this branch is in a transitional state; I'm doing active development of Mac v3.0.x. See the ‘master’ branch for the latest stable Mac version (v2.3.x).

Prerequisites:

  • Xcode 6.0 Beta4+
  • Node 0.10
  • CoffeeScript 1.6.x: npm install -g coffee-script
  • underscore.js: npm install -g underscore
  • grunt
  • optionally, Ruby 1.8.7 with Rake for running Rake tasks

For running tests:

  • Mocha 1.7.0: npm install -g mocha
  • Cucumber.js 0.3.0: npm install -g cucumber
  • fsmonitor 0.2.2: npm install -g fsmonitor (warning: don't rely on --version, it lies)

Building:

  1. Don’t forget to pull all submodules after getting the source code.

  2. Install and compile the backend modules:

     cd node_modules/livereload-new     && npm install && grunt &&
     cd ../livereload-service-dummy     && npm install && grunt
     cd ../livereload-service-server    && npm install && grunt
     cd ../livereload-service-reloader  && npm install && grunt
     cd ../livereload-soa               && npm install && grunt
     cd ../livereload-server            && coffee -c lib
     cd ../livereload-protocol          && coffee -c lib
     cd ../pathspec                     && coffee -c lib
    
  3. Package the backend modules into mac/backend:

     cd scripts && npm install
     cd ..
     scripts/node_modules/.bin/_coffee scripts/package-backend.coffee_ node_modules/livereload-new mac/backend
    

    During development, use override mode instead — open Xcode scheme settings and set LRBackendOverride env var to the full path of node_modules/livereload-new/bin/livereload.js.

  4. Open LiveReload/LiveReload.xcodeproj

  5. Build some subprojects in the correct order (because the dependencies between subprojects aren't properly tracked — let me know if you know a way to specify those), you can do this from Xcode or on the command line:

     cd mac
     make
    
  6. Build the app, you can do this from Xcode or on the command line:

     xcodebuild -project LiveReload.xcodeproj -scheme LiveReload -configuration Debug build
    

Until the project is configured correctly, you may need to clean & rebuild often before running tests. Use mac/rebuild.sh for that.

LR for Mac hacking tips

  • Add backend/ to LiveReload, enable compilation.
  • Set LRBackendOverride environment variable to /path/to/LiveReload/node_modules/livereload-new/bin/livereload.js, so your changes are picked up without rerunning rake backend.
  • To run multiple copies of LiveReload, set LRPortOverride to some unused TCP port.
  • Set LRBundledPluginsOverride to specify a path to the bundled plugins when running on the command line.
    • (Also useful for speeding up Xcode builds; temporarily delete bundled plugins from the project and set this variable so that LiveReload can find them.)

Running tests

The tests are under mac/LiveReloadTestProjects.

First, build & run LiveReload, open the main window, click the gears icon in title bar, then choose ‘Allow Access to Folder...’ and pick the LiveReloadTestProjects folder.

Then, for a testing configuration, set environment variable LRRunTests to point to the absolute path of LiveReloadTestProjects directory, e.g.

LRRunTests=/Users/andreyvit/dev/livereload/devel/mac/LiveReloadTestProjects

Additionally, you may want to add -LogToConsole YES to the list of launch arguments, so that you can see the entire output when testing.

You may also want to set LRBundledPluginsOverride environment variable, as described above.

git-subdir

We're using git-subdir to sync commits between this repository and the repositories of individual projects.

This probably is of no concern to you, but in case you need it, you can run the following commands to set it up:

git subdir node_modules/livereload/ -r cli --url [email protected]:livereload/livereload-cli.git --method squash,linear
git subdir node_modules/livereload-core/ -r core --url [email protected]:livereload/livereload-core.git --method squash,linear
git subdir node_modules/livereload-server/ -r server --url [email protected]:livereload/livereload-server.git --method squash,linear
git subdir node_modules/livereload-client/ -r client --url [email protected]:livereload/livereload-client.git --method squash,linear
git subdir node_modules/livereload-protocol/ -r protocol --url [email protected]:livereload/livereload-protocol.git --method squash,linear

git subdir node_modules/fsmonitor/ -r fsmonitor --url [email protected]:andreyvit/fsmonitor.js.git --method squash,linear
git subdir node_modules/jobqueue/ -r jobqueue --url [email protected]:livereload/jobqueue.git --method squash,linear
git subdir node_modules/pathspec/ -r pathspec --url [email protected]:andreyvit/pathspec.js.git --method squash,linear
git subdir node_modules/reactive/ -r reactive --url [email protected]:andreyvit/reactive.js.git --method squash,linear

git subdir node_modules/vfs-local/ -r vfs-local --url [email protected]:livereload/vfs-local.git --method squash,linear
git subdir node_modules/vfs-test/ -r vfs-test --url [email protected]:livereload/vfs-test.git --method squash,linear

git-subdir mac/ATPathSpec --url [email protected]:andreyvit/ATPathSpec.git --method squash,linear

Signing the bundled Node.js binary

Copy:

cp /usr/local/bin/node LiveReload/Resources/LiveReloadNodejs

Sign:

codesign -f -s "3rd Party Mac Developer Application: Andrey Tarantsov" --entitlements LiveReload/Resources/LiveReloadNodejs.entitlements LiveReload/Resources/LiveReloadNodejs

Verify:

codesign -dvvv ./LiveReload/Resources/LiveReloadNodejs

AppNewsKit

(See Stats.h/m. This is a seriously cool shit to communicate with your live users. Consider those files to be under MIT. I’ll extract and document it properly soon.)

  • Collect usage statistics
  • Deliver news to your users

Example ping.txt:

    {
        "see_explanation_at": "http://help.livereload.com/kb/about-us/usage-statistics-privacy-policy",
        "messages": [
            {
                "title": "MyApp on the Mac App Store!",
                "message": "MyApp 2.1 has been released on the Mac App Store, and is on sale (50% off)! Do you want to learn more about it?",
                "id": "myapp-2.0.0-release",
                "version": [">=2.0 <3.0"],
                "status": ["unregistered"],
                "stats": {
                    "stat.reloads": { "min": 10 }
                },
                "delay_if_nagged_within": "3d",
                "remind_later_in": "5d",
                "deliver_after": "2011-12-08 16:33:00",
                "wait_until_good_time": true,
                "delivery_on_stats": {
                    "or": {
                        "stat.reloads.last": { "within": 30 },
                        "stat.launch.first": { "within": 120 }
                    }
                },
                "random_percentage": 50,
                "primary_button_url": "http://myapp.com/mas/",
                "primary_button_title": "Visit Mac App Store"
            }
        ]
    }

livereload's People

Contributors

andreyvit avatar markstreich avatar meredian avatar nitoyon avatar ttilley avatar tvasenin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

livereload's Issues

Fix keyboard navigation in the new UI XAML

Fix the new XAML on “actions+files” page (aka ActionsFilesHub control) so that:

  • up/down arrows navigate between rows,
  • left/right arrows collapse and expand rows.

The XAML does not necessarily need to stay as a TreeView, I would be okay with any choice of controls.

stylesheet/less not picked up for less.js refresh

UV-3272:

Testing LR for Windows8 with SublimeText2. LR works fine when this used: <link rel="stylesheet" href="less/main.less">, but throws its arms up at <link rel="stylesheet/less" href="less/main.less">. I need the /less bit to get less.js (1.33) to do its magic in the browser.

Gemsets

How can I set up LiveReload to use a different gemset? I tried using both a per project .rvmrc file and a simple 'rvm gemset create' but it just won't recognize them in the drop down list even after a reload of the app.

Thanks!

Resolve layering issues in livereload-core

Right now, the dependencies within livereload-core aren't very clear. There is a number of interdependent components; we should reorganize the code so that these components are clearly separated, and then document the dependencies.

Ignore temp, log and SCM files

From UV-3144:

It appears that LiveReload is doing phantom reloads. I make no change to the directory and yet the page still refreshes. This is a rails app. I wonder if LiveReload is properly excluding temp files (or if there is an option to turn off some paths, such as tmp or svn)

Virus warning in WpfAnimatedGif.dll

UV-3326:

I can't install LiveReload on my Windows XP SP3, when downloading process reach about 92%, an alert comes out as Cannot Start Application.jpg shows.

The reason is, when the installation trying to download file
http://download.livereload.com/windows/Application%20Files/LiveReload_0_8_6_0/WpfAnimatedGif.dll.deploy
the process was blocked by my proxy virus checking, it says:

VirusName: McAfeeGW: Heuristic.BehavesLike.Win32.Suspicious-BAY.K

We need to:

  • check if there's a virus in there (probably not)
  • replace the file with something else (or get rid of animated gif altogether), because it's not worth the false positives
  • notify the maintainers about the virus warning, and the results of our check

EPERM crash on shutdown

From UV-3144:

I noticed another crash at shutdown, here is the log snippet

STDERR: 
STDERR: events.js:72 
STDERR: throw er; // Unhandled 'error' event 
STDERR: ^ 
STDERR: Error: watch EPERM 
STDERR: at errnoException (fs.js:1005:11) 
STDERR: at FSEvent.FSWatcher._handle.onchange (fs.js:1023:26) 
Node.js appears to have crashed. 
LiveReload says bye.

************************************************************************ 
Unhandled Exception in UI thread: System.NullReferenceException: Object reference not set to an instance of an object. 
at LiveReload.App.EmergencyShutdown(String reason) 
at LiveReload.App.HandleNodeCrash() 
at LiveReload.NodeRPC.<NodeRun>b__2() 
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
************************************************************************

************************************************************************ 
Unhandled Exception in UI thread: System.NullReferenceException: Object reference not set to an instance of an object. 
at LiveReload.App.EmergencyShutdown(String reason) 
at LiveReload.App.ReportUnhandledException(Exception exception, String threadName) 
at LiveReload.App.Application_DispatcherUnhandledException(Object sender, DispatcherUnhandledExceptionEventArgs e) 
at System.Windows.Threading.Dispatcher.CatchException(Exception e) 
at System.Windows.Threading.Dispatcher.CatchExceptionStatic(Object source, Exception e) 
at System.Windows.Threading.ExceptionWrapper.CatchException(Object source, Exception e, Delegate catchHandler) 
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) 
at System.Threading.ExecutionContext.runTryCode(Object userData) 
at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
at System.Windows.Threading.DispatcherOperation.Invoke() 
at System.Windows.Threading.Dispatcher.ProcessQueue() 
at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
************************************************************************

Another copy of livereload.js confuses LiveReload

If you have your own script called livereload.js (perhaps you've put our snippet there), the actual livereload.js might try to derive its options from that file, thus accessing a wrong host.

UV-3345.

Configurable output paths

We need to provide a way to configure output paths in the Windows version. This will most likely come as part of the new rules system, but the required UI changes is still a separate task.

UV-3263.

Sync observable collections in Twins

Right now, Twins library does not handle entity collections in any way, and the goal of this ticket is to add first-class support for collections.

Current state

Twins can only:

  • perform assignments of simple atomic values (like strings) to entity properties,
  • navigate to existing named subentities (#mainwnd #addProjectButton).

It cannot:

  • create new entities
  • delete entities
  • sync lists of entities (i.e. create / delete / update)

While some supported controls (TreeView) can accept a collection of items, the collection is basically treated like an atomic value, and each item does not become an entity.

This has been an acceptable workaround for single-level trees, but won't work when syncing view models, where each item is an entity of its own, and has to participate in further subentity syncing.

Goal

We want an update like this:

{
    "#mainwnd": {
        "#actionGroups": [
            {
                "id": "stylesheets",
                "title": "stylesheets",
                "#actions": [
                    {
                        "id": "compile.sass",
                        "name": "compile sass",
                        "#rules": [
                            {
                                "id": "R12345",
                                "sourceMask": "*.sass",
                                "destinationMask": "*.css",
                                "#files": [
                                    {
                                        "id": "F1234",
                                        "enabled": true,
                                        "sourcePath": "foo.sass",
                                        "destinationPath": "foo.css"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

to sync the list of ActionGroups, Actions, Rules and RuleFiles inside the view model.

Implementation

Entity syncing should be performed when we reach a property of ObservableCollection type. This property will always be treated as read-only, and the returned collection will be manipulated instead of being overwritten.

We want to create an EntityCollection class to track the list of subentities inside the entity.

It's safe to assume that every model class that we want to sync this way has to provide a string Id property, and we probably want to define a C# interface for that.

We'll need to know which C# class to create when new entities are added; for that, we can probably provide some reasonable default logic (based on the generic type of the ObservableCollection), overridable using an optional interface implemented by the parent entity.

compass detection: hint

I just found out, why my compass import did not trigger the compass option, when I used it in some other project:

@import 'compass'; /* is not detected by LiveReload */

vs.

@import 'compass/css3'; /* is detected by LiveReload */

You might want to change detection so it triggers with a less verbose import. So others don't have to wonder like me.

LiveReload is great, keep on the great work!

  • Jerry

Try to get a non-sandboxed Mac update released

LiveReload 2 hasn't really accumulated any new features in 2.3.x branch, so we should try to get non-sandboxed LiveReload past the App Store review process. We're not guaranteed to be lucky by any means, but it's worth a try.

Are all browser extensions published?

UV-3294:

i solved this by installing the 2.0.9 version of the extension, I had
2.0.8 before from a official link. Someone on StackOverflow pointed to
2.0.9. Before there was nothing added to the pages HTML i could find. I
am not 1000% sure about this because i sort of done serval things at
once but you might want to update your link here to 2.0.9

Modifying .scss causes a full page reload

UV-3266 (v0.8.5.1):

I'm using Sass (not generated by LiveReload, since I'm generating sourcemaps). If I change a .scss file, the browser at first changes the styles, but then it reloads the whole page, unecessarily so...

If I then modify the CSS file, jsut the styles are reloaded, as you would expect.

Log file grows quickly

UV-3144:

the log file seems to grow very quickly. A first launch resulted in 45MB of entries.

LR for Windows logs too much stuff

UV-3280:

I just noticed some time ago that something is eating my hdd space.
And in c:\Users\MyUser\AppData\Local\LiveReload\Logs I've found 5gb of log files.

We need to delete old logs, and we need to reduce the amount of stuff that gets logged.

Install a series of VMs for testing

To test LiveReload, we need every major version of Windows OS installed on h1:

  • Windows XP SP3
  • Windows Vista
  • Windows 7
  • Windows 8

We want stock installs with no additional software added. Also:

  • use our BizSpark licenses
  • propose a solution for keeping the installs read-only, but still updated with the latest required updates (snapshots? manual switching between mutable and immutable?)
  • disable automatic updates, the OSes will not be running long enough to update automatically anyway; we will update each version manually, and don't want surprises
  • document any installation/VM options, file paths, VM names, etc somewhere (Gist / Wiki / Workflowy)

User-configurable file-to-file compilation rules

As a first step to delivering a fancy rule system, we want to add a Rules tab that contains a tree looking like:

- CompileLESS: **/*.less → **/*.css
    foo.less → foo.css
    bar.less → bar.css
+ CompileCoffee: **/*.coffee → **/*.js

The configured rules are the top-level items, and if you expand a rule, you see a list of matched files.

We might want to have separate “paths” and “rules” tabs because sometimes it's convenient to browse configuration by file locations, and sometimes by the rules.

You can edit actions, sources and destination of rules, and actions and destinations of individual files. The intended result is that people can choose to ignore rules and configure output paths per-file like in LiveReload 2, or they can choose to ignore files and configure the rules, or any mix of the two.

Only file-to-file compilers are supported for now (e.g. LESS and Sass, but not Compass). The only available types of rules thus are:

  • FileToFileRule with three user-visible attributes: action (“CompileLESS”), sourceMask and destinationMask
  • FileRule with two user-visible attributes: action (“Ignore”, “ReloadPage”) and sourceMask

In the future, other types of rules will be added to cover subfolder-level compilers (like Compass) and other kinds of actions (SSH uploads, minification, concatenation, etc).

A project starts with a default set of rules, which always have sourceMask of **/*.{source_ext} and destinationMask of **/*.{destination_ext}. These implicit rules are not saved anywhere (so that if the next version of LiveReload has a different set of implicit rules, they will be picked up right away) and are invisible unless they match at least one file.

Users can add and remove rules. These explicit rules take precedence over implicit rules.

Users can change existing rules. When the action is modified, the old rule is deleted and a new one is created. E.g. you can change “CompileLESS” action into “Ignore”, then the sourceMask will be preserved, and destinationMask will disappear.

If you remove an implicit rule, it is converted into an explicit Ignore rule instead. (Or maybe not “Ignore”, but something more appropriate.)

Users can modify the actions and destinations of individual files / selected groups of files. This creates a new rule on top of the current one (so that it takes precedence), or adds the file to a similar existing rule (possibly generalizing the mask). The way masks are produced from individual files will be a bit tricky to get right.

The global “Compilation enabled” switch enables or disables all compilation rules, including the implicit ones. When compilation is disabled, implicit rules are not visible. If you add an explicit compilation rule, compilation is automatically enabled, and Ignore rules are added as if you manually removed all implicit rules.

At least that's the plan. :-)

Ignore individual files

Although this will be a part of LiveReload 3, we should actually release a LiveReload 2 update that adds this feature.

Zombie LiveReloadNodejs.exe

Looks like sometimes LiveReloadNodejs.exe is kept running after LiveReload.exe quits, preventing future updates. Might be related to crashes or something. Observed both in development, and on UV-3205.

Use SHA1 or MD5 sums to check if resources have changed

Add res/bundled/something.7z.hash for each bundled resource, store this instead of the timestamp file when extracting, use it for comparison. (At run time, the contents of the file is basically an opaque version identifier string; the exact hashing algorithm is not important.)

Stylus compiler ignores output file name

UV-3313:

This looks like a bug: I set foo.styl to compile to foo.styl.css but it compiles to foo.css

Confirmed that the output file name is ignored completely.

0.8.5.1 autorefresh issues

As far as I could see there are some issues with 8.5.1:

  1. it does not refresh when .css files are modified. This should trigger auto-refresh.
  2. it does not refresh when .scss files are modified (which is right) but it counts the scss modifications as changes and refreshes (info in the lower part of app). I don't know what the policy is, if it should count it as modification, but for shure it should not count it as a refresh since no refresh is done.
  3. .haml files trigger auto-refresh which is not right.

Provide a portable version

Ideally, we want a portable version with automatic update notifications, but it's probably not possible out of the box with ClickOnce, and so can be done some day later.

For a start, we want a script that simply packages the binaries as a zip and uploads to download.livereload.com.

Building LR is quite problematic when following README instructions

Love LR. Can't work without it. Since the App Store version is far behind the GH one, I tried to compile LR on my own, but came across multiple problems.

When following instructions from devel we'll get this:

$ iced -I inline -c cli
File not found: cli.coffee

When following instructions from master we'll get the following:

$ rake backend
rake aborted!
cannot load such file -- tasks/backend
/Users/oskar/Desktop/LiveReload2/Rakefile:5:in `<top (required)>'

Any tips on why the instructions are causing these issues?

ECONNRESET crash on browser disconnection

UV-3239:

Just got a crash using Windows version 0.8.4.0
I was using Livereload with Safari for Windows 5.1.7 (Livereload extension
2.0.9). The crash happened just at the moment I closed the browser.

The log:

INCOMING: ["rpc",{"#mainwnd":{"#textBlockStatus":{"text":"Idle. 1 browser connected. 1 change, 0 files compiled, 1 refresh so far."}}}]
STDERR: Thu, 21 Mar 2013 16:20:18 GMT wsio:drafts websocket-hixie received data packet {"command":"info","plugins":{"less":{"disable":false,"version":"1.0"}},"url":"http://127.0.0.1:90/gcba/PortalFestivales-2013/htdocs/web/"}
STDERR: Thu, 21 Mar 2013 16:20:18 GMT livereload:server LRWebSocketConnection(C3) received {"command":"info","plugins":{"less":{"disable":false,"version":"1.0"}},"url":"http://127.0.0.1:90/gcba/PortalFestivales-2013/htdocs/web/"}
STDERR: Thu, 21 Mar 2013 16:20:18 GMT livereload:core:session Ignoring unknown command info: {"command":"info","plugins":{"less":{"disable":false,"version":"1.0"}},"url":"http://127.0.0.1:90/gcba/PortalFestivales-2013/htdocs/web/"}
STDERR: Thu, 21 Mar 2013 16:20:20 GMT reactive Change: Stats0.connectionCount is now 0
STDERR: Thu, 21 Mar 2013 16:20:20 GMT reactive Executing block MainWindow0_B0_render_status
STDERR: Thu, 21 Mar 2013 16:20:20 GMT reactive MainWindow0_B0_render_status depends on MainWindow(#mainwnd).status
STDERR: Thu, 21 Mar 2013 16:20:20 GMT reactive MainWindow0_B0_render_status depends on Stats0.connectionCount
STDERR: Thu, 21 Mar 2013 16:20:20 GMT reactive MainWindow0_B0_render_status depends on Stats0.changes
STDERR: Thu, 21 Mar 2013 16:20:20 GMT reactive MainWindow0_B0_render_status depends on Stats0.compilations
STDERR: Thu, 21 Mar 2013 16:20:20 GMT reactive MainWindow0_B0_render_status depends on Stats0.refreshes
STDERR: Thu, 21 Mar 2013 16:20:20 GMT livereload:rpc Node to App: ["rpc",{"#mainwnd":{"#textBlockStatus":{"text":"Idle. 0 browsers connected. 1 change, 0 files compiled, 1 refresh so far."}}}]
INCOMING: ["rpc",{"#mainwnd":{"#textBlockStatus":{"text":"Idle. 0 browsers connected. 1 change, 0 files compiled, 1 refresh so far."}}}]
STDERR: 
STDERR: events.js:72
STDERR:         throw er; // Unhandled 'error' event
STDERR:               ^
STDERR: Error: read ECONNRESET
STDERR:     at errnoException (net.js:863:11)
STDERR:     at TCP.onread (net.js:524:19)
Node.js appears to have crashed.
LiveReload says bye.

Crash when the data file is corrupted

As per UV-3243, we have two issues with corrupted data file:

  1. The fact that it gets corrupted in the first place. Waiting for more into on that.

  2. The fact that we crash when it gets corrupted:

    STDERR: 
    STDERR: C:\Users\Borek\AppData\Local\LiveReload\Bundled\backend\lib\services\preferences.js:32
    STDERR:             LR.log.wtf("Failed to parse preference file " + _this.path);
    STDERR:                    ^
    STDERR: TypeError: Cannot call method 'wtf' of undefined
    STDERR:     at C:\Users\Borek\AppData\Local\LiveReload\Bundled\backend\lib\services\preferences.js:32:20
    STDERR:     at fs.js:252:14
    STDERR:     at Object.oncomplete (fs.js:93:15)
    

We need to show a reasonable UI message and recover by backing up the data file and overwriting it with a new one.

Chrome Dev 19.0.1068.0 breaks LiveReload2

Hey

since switching to the most up-to-date chrome dev, LiveReload2 has stopped refreshing my page.

An interesting error I see is that the number of connected browsers is constantly increasing, it seems to not pick up disconnect events from this chrome at all.

I tried to install the browser plug-in (I was using just the script previously) and the plugin (2.0.5) does not fix things either. It complains that it can't connect to the LiveReload 2 Server when it's clicked, but the connected browser count further increases.

Thanks!

I'm busy reinstalling non-dev chrome to compare its behaviour, will report back.

Implement early bird promo

Provide free/discounted licenses for the early users in exchange for their email addresses.

E.g.:

  • free license for those who sign up until May 1
  • 75% discount for those who sign up until June 1
  • 50% discount for those who sign up until July 1

This should be an in-app offer that POSTs their email address to our API endpoint. The form looks like this:

Email: ___________________________

We'll send an email with your discount code when we launch.

Additionally, sign up for LiveReload newsletter (once per month) for:
  [ ] Windows   [ ] Mac   [ ] Linux

[ submit ]

Our goal here is to:

  • reward early users for the inconveniences they had to put up with;
  • spread the news about the launch faster by emailing a large group of people.

Not sure when and how the form should be displayed, though. Maybe as an ‘early-bird offer’ item in the main tree.

Create and document a staging process for Windows releases

  1. Discover a way to override install URL and release a version into a staging environment, so that it can be tested with ClickOnce, but without pushing it into the main autoupdate channel.

    (Hint hint: build with a staging install URL once. Copy that Setup.exe somewhere. Will it install from the staging environment?)

  2. Propose a staging URL on S3 server, have me sign off on it. Preferably, the binary files should be shared, only the app manifest should have a different name.

  3. Create the scripts to release into a staging environment.

  4. Describe the staging process (how to release and how to install a stage version) in a Wiki page of this repo.

Check for updates in background

  1. Have the Windows version check for updates in background — on every startup and every hour after that (don't save any timestamps, just set an hourly timer on startup).
  2. When an update is available, download and install it in the background without further confirmations or notifications.
  3. Show a ‘restart to update to vX.Y.Z’ banner in the title bar that includes the new version number (do not consult with me on the formatting, I will adjust it to my taste later); show version number as X.Y.Z or X.Y.Z.U depending on whether U is zero.
  4. Clicking the banner restarts the app without further confirmations.
  5. Make sure the new version is picked up upon restart.
  6. Provide a debug option (in the service menu; on/off toggle) to override update checking to run every minute instead (for debugging).
  7. Provide a debug option (in the service menu; on/off toggle) to simulate a failed update on the next check; do it by overriding update URL to a one that points to a release that's always newer (like v99.0.0), but is missing some of the files.
  8. Make sure that failed updates are handled properly (i.e. completely ignored without additional messages).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.