Hello community, here is the log from the commit of package rubygem-rb-fsevent for openSUSE:Factory checked in at 2017-08-21 11:36:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/rubygem-rb-fsevent (Old) and /work/SRC/openSUSE:Factory/.rubygem-rb-fsevent.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rubygem-rb-fsevent" Mon Aug 21 11:36:53 2017 rev:6 rq:515058 version:0.10.2 Changes: -------- --- /work/SRC/openSUSE:Factory/rubygem-rb-fsevent/rubygem-rb-fsevent.changes 2016-11-07 12:23:23.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.rubygem-rb-fsevent.new/rubygem-rb-fsevent.changes 2017-08-21 11:36:58.762708299 +0200 @@ -1,0 +2,6 @@ +Thu Aug 3 19:36:27 UTC 2017 - co...@suse.com + +- updated to version 0.10.2 + no changelog found + +------------------------------------------------------------------- Old: ---- rb-fsevent-0.9.8.gem New: ---- rb-fsevent-0.10.2.gem ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ rubygem-rb-fsevent.spec ++++++ --- /var/tmp/diff_new_pack.y402EL/_old 2017-08-21 11:37:00.022531117 +0200 +++ /var/tmp/diff_new_pack.y402EL/_new 2017-08-21 11:37:00.046527742 +0200 @@ -1,7 +1,7 @@ # # spec file for package rubygem-rb-fsevent # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -24,7 +24,7 @@ # Name: rubygem-rb-fsevent -Version: 0.9.8 +Version: 0.10.2 Release: 0 %define mod_name rb-fsevent %define mod_full_name %{mod_name}-%{version} ++++++ rb-fsevent-0.9.8.gem -> rb-fsevent-0.10.2.gem ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Gemfile new/Gemfile --- old/Gemfile 2016-10-24 20:23:48.000000000 +0200 +++ new/Gemfile 2017-07-01 05:41:18.000000000 +0200 @@ -1,6 +1,3 @@ source "https://rubygems.org" gemspec - -gem 'rake' - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/README.md new/README.md --- old/README.md 2016-10-24 20:23:48.000000000 +0200 +++ new/README.md 2017-07-01 05:41:18.000000000 +0200 @@ -7,8 +7,8 @@ * RubyCocoa not required! * Signals are working (really) -* Tested on MRI 2.1, RBX 2.5, JRuby -* Tested on 10.10 +* Tested on MRI 2.4.1, RBX 3.72, JRuby 1.7.26 and 9.1.8.0 +* Tested on 10.8 ## HFS+ filename corruption bug @@ -131,6 +131,23 @@ fsevent.run ``` +### Using _full_ event information + +```ruby +require 'rb-fsevent' +fsevent = FSEvent.new +fsevent.watch Dir.pwd do |paths, event_meta| + event_meta.events.each do |event| + puts "event ID: #{event.id}" + puts "path: #{event.path}" + puts "c flags: #{event.cflags}" + puts "named flags: #{event.flags.join(', ')}" + # named flags will include strings such as `ItemInodeMetaMod` or `OwnEvent` + end +end +fsevent.run +``` + ## Options When defining options using a hash or hash-like object, it gets checked for validity and converted to the appropriate fsevent\_watch commandline arguments array when the FSEvent class is instantiated. This is obviously the safest and preferred method of passing in options. @@ -233,7 +250,7 @@ The list of tested targets is currently: - %w[2.2.2 2.3.0-dev rbx-2.5.5 jruby-1.7.9] + %w[2.4.1 rbx-3.72 jruby-1.7.26 jruby-9.1.8.0] ## Authors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Rakefile new/Rakefile --- old/Rakefile 2016-10-24 20:23:48.000000000 +0200 +++ new/Rakefile 2017-07-01 05:41:18.000000000 +0200 @@ -9,7 +9,7 @@ namespace(:spec) do desc "Run all specs on multiple ruby versions" task(:portability) do - versions = %w[2.2.2 2.3.0-dev rbx-2.5.5 jruby-1.7.9] + versions = %w[2.4.1 rbx-3.72 jruby-1.7.26 jruby-9.1.8.0] versions.each do |version| # system <<-BASH # bash -c 'source ~/.rvm/scripts/rvm; @@ -24,6 +24,7 @@ [[ ! -a $HOME/.rbenv/versions/#{version} ]] && rbenv install #{version}; rbenv shell #{version}; rbenv which bundle 2> /dev/null || gem install bundler; + rm Gemfile.lock; bundle install; rake spec;' BASH Binary files old/bin/fsevent_watch and new/bin/fsevent_watch differ Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/fsevent_watch/cli.c new/ext/fsevent_watch/cli.c --- old/ext/fsevent_watch/cli.c 2016-10-24 20:23:48.000000000 +0200 +++ new/ext/fsevent_watch/cli.c 2017-07-01 05:41:18.000000000 +0200 @@ -27,7 +27,7 @@ args_info->ignore_self_flag = false; args_info->file_events_flag = false; args_info->mark_self_flag = false; - args_info->format_arg = kFSEventWatchOutputFormatClassic; + args_info->format_arg = kFSEventWatchOutputFormatOTNetstring; } static void cli_parser_release (struct cli_info* args_info) @@ -199,4 +199,3 @@ return EXIT_SUCCESS; } - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/fsevent_watch/compat.c new/ext/fsevent_watch/compat.c --- old/ext/fsevent_watch/compat.c 2016-10-24 20:23:48.000000000 +0200 +++ new/ext/fsevent_watch/compat.c 2017-07-01 05:41:18.000000000 +0200 @@ -1,10 +1,13 @@ #include "compat.h" -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060 + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) FSEventStreamCreateFlags kFSEventStreamCreateFlagIgnoreSelf = 0x00000008; #endif -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070 +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_7) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) FSEventStreamCreateFlags kFSEventStreamCreateFlagFileEvents = 0x00000010; FSEventStreamEventFlags kFSEventStreamEventFlagItemCreated = 0x00000100; FSEventStreamEventFlags kFSEventStreamEventFlagItemRemoved = 0x00000200; @@ -19,7 +22,20 @@ FSEventStreamEventFlags kFSEventStreamEventFlagItemIsSymlink = 0x00040000; #endif -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1090 +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_9) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0) FSEventStreamCreateFlags kFSEventStreamCreateFlagMarkSelf = 0x00000020; FSEventStreamEventFlags kFSEventStreamEventFlagOwnEvent = 0x00080000; #endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0) +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsHardlink = 0x00100000; +FSEventStreamEventFlags kFSEventStreamEventFlagItemIsLastHardlink = 0x00200000; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0) +FSEventStreamCreateFlags kFSEventStreamCreateFlagUseExtendedData = 0x00000040; +FSEventStreamEventFlags kFSEventStreamEventFlagItemCloned = 0x00400000; +#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/fsevent_watch/compat.h new/ext/fsevent_watch/compat.h --- old/ext/fsevent_watch/compat.h 2016-10-24 20:23:48.000000000 +0200 +++ new/ext/fsevent_watch/compat.h 2017-07-01 05:41:18.000000000 +0200 @@ -9,20 +9,57 @@ */ -#ifndef fsevent_watch_compat_h -#define fsevent_watch_compat_h +#ifndef listen_fsevents_compat_h +#define listen_fsevents_compat_h #ifndef __CORESERVICES__ #include <CoreServices/CoreServices.h> #endif // __CORESERVICES__ -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060 -// ignoring events originating from the current process introduced in 10.6 +#ifndef __AVAILABILITY__ +#include <Availability.h> +#endif // __AVAILABILITY__ + +#ifndef __MAC_10_6 +#define __MAC_10_6 1060 +#endif +#ifndef __MAC_10_7 +#define __MAC_10_7 1070 +#endif +#ifndef __MAC_10_9 +#define __MAC_10_9 1090 +#endif +#ifndef __MAC_10_10 +#define __MAC_10_10 101000 +#endif +#ifndef __MAC_10_13 +#define __MAC_10_13 101300 +#endif +#ifndef __IPHONE_6_0 +#define __IPHONE_6_0 60000 +#endif +#ifndef __IPHONE_7_0 +#define __IPHONE_7_0 70000 +#endif +#ifndef __IPHONE_9_0 +#define __IPHONE_9_0 90000 +#endif +#ifndef __IPHONE_11_0 +#define __IPHONE_11_0 110000 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_6) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) extern FSEventStreamCreateFlags kFSEventStreamCreateFlagIgnoreSelf; #endif -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070 -// file-level events introduced in 10.7 +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_7) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_6_0) extern FSEventStreamCreateFlags kFSEventStreamCreateFlagFileEvents; extern FSEventStreamEventFlags kFSEventStreamEventFlagItemCreated, kFSEventStreamEventFlagItemRemoved, @@ -37,11 +74,27 @@ kFSEventStreamEventFlagItemIsSymlink; #endif -#if MAC_OS_X_VERSION_MAX_ALLOWED < 1090 -// marking, rather than ignoring, events originating from the current process introduced in 10.9 +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_9) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0) extern FSEventStreamCreateFlags kFSEventStreamCreateFlagMarkSelf; extern FSEventStreamEventFlags kFSEventStreamEventFlagOwnEvent; #endif +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_10) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_9_0) +extern FSEventStreamEventFlags kFSEventStreamEventFlagItemIsHardlink, + kFSEventStreamEventFlagItemIsLastHardlink; +#endif + +#if (defined(MAC_OS_X_VERSION_MAX_ALLOWED) && MAC_OS_X_VERSION_MAX_ALLOWED < __MAC_10_13) || \ + (defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_11_0) +extern FSEventStreamCreateFlags kFSEventStreamCreateFlagUseExtendedData; +extern FSEventStreamEventFlags kFSEventStreamEventFlagItemCloned; +#endif + + +#ifdef __cplusplus +} +#endif -#endif // fsevent_watch_compat_h +#endif // listen_fsevents_compat_h diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/fsevent_watch/main.c new/ext/fsevent_watch/main.c --- old/ext/fsevent_watch/main.c 2016-10-24 20:23:48.000000000 +0200 +++ new/ext/fsevent_watch/main.c 2017-07-01 05:41:18.000000000 +0200 @@ -24,7 +24,7 @@ (double) 0.3, (CFOptionFlags) kFSEventStreamCreateFlagNone, NULL, - kFSEventWatchOutputFormatClassic + kFSEventWatchOutputFormatOTNetstring }; // Prototypes @@ -350,18 +350,54 @@ false); CFDictionarySetValue(event, CFSTR("path"), path); - CFNumberRef flags = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &eventFlags[i]); - CFDictionarySetValue(event, CFSTR("flags"), flags); - CFNumberRef ident = CFNumberCreate(kCFAllocatorDefault, kCFNumberLongLongType, &eventIds[i]); CFDictionarySetValue(event, CFSTR("id"), ident); + CFNumberRef cflags = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &eventFlags[i]); + CFDictionarySetValue(event, CFSTR("cflags"), cflags); + + CFMutableArrayRef flags = CFArrayCreateMutable(kCFAllocatorDefault, + 0, &kCFTypeArrayCallBacks); + +#define FLAG_ADD_NAME(flagsnum, flagnum, flagname, flagarray) \ + do { \ + if (FLAG_CHECK(flagsnum, flagnum)) { \ + CFArrayAppendValue(flagarray, CFSTR(flagname)); } } \ + while(0) + + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagMustScanSubDirs, "MustScanSubDirs", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagUserDropped, "UserDropped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagKernelDropped, "KernelDropped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagEventIdsWrapped, "EventIdsWrapped", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagHistoryDone, "HistoryDone", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagRootChanged, "RootChanged", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagMount, "Mount", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagUnmount, "Unmount", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemCreated, "ItemCreated", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemRemoved, "ItemRemoved", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemInodeMetaMod, "ItemInodeMetaMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemRenamed, "ItemRenamed", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemModified, "ItemModified", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemFinderInfoMod, "ItemFinderInfoMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemChangeOwner, "ItemChangeOwner", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemXattrMod, "ItemXattrMod", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsFile, "ItemIsFile", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsDir, "ItemIsDir", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsSymlink, "ItemIsSymlink", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagOwnEvent, "OwnEvent", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsHardlink, "ItemIsHardLink", flags); + FLAG_ADD_NAME(eventFlags[i], kFSEventStreamEventFlagItemIsLastHardlink, "ItemIsLastHardLink", flags); + + CFDictionarySetValue(event, CFSTR("flags"), flags); + + CFArrayAppendValue(events, event); CFRelease(event); CFRelease(path); - CFRelease(flags); CFRelease(ident); + CFRelease(cflags); + CFRelease(flags); } CFMutableDictionaryRef meta = CFDictionaryCreateMutable(kCFAllocatorDefault, @@ -446,7 +482,10 @@ " Item is a directory"); FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsSymlink, " Item is a symbolic link"); - + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsHardlink, + " Item is a hard link"); + FLAG_CHECK_STDERR(eventFlags[i], kFSEventStreamEventFlagItemIsLastHardlink, + " Item is the last hard link"); fprintf(stderr, " event path: %s\n", paths[i]); fprintf(stderr, "\n"); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/ext/rakefile.rb new/ext/rakefile.rb --- old/ext/rakefile.rb 2016-10-24 20:23:48.000000000 +0200 +++ new/ext/rakefile.rb 2017-07-01 05:41:18.000000000 +0200 @@ -8,7 +8,7 @@ raise "unable to find xcodebuild" unless system('which', 'xcodebuild') -FSEVENT_WATCH_EXE_VERSION = '0.1.4' +FSEVENT_WATCH_EXE_VERSION = '0.1.5' $this_dir = Pathname.new(__FILE__).dirname.expand_path $final_exe = $this_dir.parent.join('bin/fsevent_watch') @@ -148,7 +148,7 @@ key['CFBundleDisplayName'] string['FSEvent Watch CLI'] key['NSHumanReadableCopyright'] - string['Copyright (C) 2011-2015 Travis Tilley'] + string['Copyright (C) 2011-2017 Travis Tilley'] key['CFBundleVersion'] string["#{FSEVENT_WATCH_EXE_VERSION}"] @@ -216,8 +216,10 @@ sh "codesign -s '#{$CODE_SIGN_IDENTITY}' #{$obj_dir.join('fsevent_watch')}" end +directory $this_dir.parent.join('bin') + desc 'replace bundled fsevent_watch binary with build/fsevent_watch' -task :replace_exe => :build do +task :replace_exe => [$this_dir.parent.join('bin'), :build] do sh "mv #{$obj_dir.join('fsevent_watch')} #{$final_exe}" end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/otnetstring.rb new/lib/otnetstring.rb --- old/lib/otnetstring.rb 1970-01-01 01:00:00.000000000 +0100 +++ new/lib/otnetstring.rb 2017-07-01 05:41:18.000000000 +0200 @@ -0,0 +1,85 @@ +# Copyright (c) 2011 Konstantin Haase +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +require 'stringio' + +module OTNetstring + class Error < StandardError; end + + class << self + def parse(io, encoding = 'internal', fallback_encoding = nil) + fallback_encoding = io.encoding if io.respond_to? :encoding + io = StringIO.new(io) if io.respond_to? :to_str + length, byte = "", nil + + while byte.nil? || byte =~ /\d/ + length << byte if byte + byte = io.read(1) + end + + if length.size > 9 + raise Error, "#{length} is longer than 9 digits" + elsif length !~ /\d+/ + raise Error, "Expected '#{byte}' to be a digit" + end + length = Integer(length) + + case byte + when '#' then Integer io.read(length) + when ',' then with_encoding io.read(length), encoding, fallback_encoding + when '~' then + raise Error, "nil has length of 0, #{length} given" unless length == 0 + when '!' then io.read(length) == 'true' + when '[', '{' + array = [] + start = io.pos + array << parse(io, encoding, fallback_encoding) while io.pos - start < length + raise Error, 'Nested element longer than container' if io.pos - start != length + byte == "{" ? Hash[*array] : array + else + raise Error, "Unknown type '#{byte}'" + end + end + + def encode(obj, string_sep = ',') + case obj + when String then with_encoding "#{obj.bytesize}#{string_sep}#{obj}", "binary" + when Integer then encode(obj.inspect, '#') + when NilClass then "0~" + when Array then encode(obj.map { |e| encode(e) }.join, '[') + when Hash then encode(obj.map { |a,b| encode(a)+encode(b) }.join, '{') + when FalseClass, TrueClass then encode(obj.inspect, '!') + else raise Error, 'cannot encode %p' % obj + end + end + + private + + def with_encoding(str, encoding, fallback = nil) + return str unless str.respond_to? :encode + encoding = Encoding.find encoding if encoding.respond_to? :to_str + encoding ||= fallback + encoding ? str.encode(encoding) : str + rescue EncodingError + str.force_encoding(encoding) + end + end +end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/rb-fsevent/fsevent.rb new/lib/rb-fsevent/fsevent.rb --- old/lib/rb-fsevent/fsevent.rb 2016-10-24 20:23:48.000000000 +0200 +++ new/lib/rb-fsevent/fsevent.rb 2017-07-01 05:41:19.000000000 +0200 @@ -1,5 +1,7 @@ # -*- encoding: utf-8 -*- +require 'otnetstring' + class FSEvent class << self class_eval <<-END @@ -40,9 +42,41 @@ # please note the use of IO::select() here, as it is used specifically to # preserve correct signal handling behavior in ruby 1.8. while @running && IO::select([@pipe], nil, nil, nil) - if line = @pipe.readline - modified_dir_paths = line.split(':').select { |dir| dir != "\n" } - callback.call(modified_dir_paths) + # managing the IO ourselves allows us to be careful and never pass an + # incomplete message to OTNetstring.parse() + message = "" + length = "" + byte = nil + + reading_length = true + found_length = false + + while reading_length + byte = @pipe.read(1) + if "#{byte}" =~ /\d/ + length << byte + found_length = true + elsif found_length == false + next + else + reading_length = false + end + end + length = Integer(length, 10) + type = byte + + message << "#{length}#{type}" + message << @pipe.read(length) + + decoded = OTNetstring.parse(message) + modified_paths = decoded["events"].map {|event| event["path"]} + # passing the full info as a second block param feels icky, but such is + # the trap of backward compatibility. + case callback.arity + when 1 + callback.call(modified_paths) + when 2 + callback.call(modified_paths, decoded) end end rescue Interrupt, IOError, Errno::EBADF @@ -110,7 +144,7 @@ private def parse_options(options={}) - opts = [] + opts = ['--format=otnetstring'] opts.concat(['--since-when', options[:since_when]]) if options[:since_when] opts.concat(['--latency', options[:latency]]) if options[:latency] opts.push('--no-defer') if options[:no_defer] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/lib/rb-fsevent/version.rb new/lib/rb-fsevent/version.rb --- old/lib/rb-fsevent/version.rb 2016-10-24 20:23:48.000000000 +0200 +++ new/lib/rb-fsevent/version.rb 2017-07-01 05:41:19.000000000 +0200 @@ -1,5 +1,5 @@ # -*- encoding: utf-8 -*- class FSEvent - VERSION = '0.9.8' + VERSION = '0.10.2' end diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/metadata new/metadata --- old/metadata 2016-10-24 20:23:48.000000000 +0200 +++ new/metadata 2017-07-01 05:41:18.000000000 +0200 @@ -1,7 +1,7 @@ --- !ruby/object:Gem::Specification name: rb-fsevent version: !ruby/object:Gem::Version - version: 0.9.8 + version: 0.10.2 platform: ruby authors: - Thibaud Guillaume-Gentil @@ -9,7 +9,7 @@ autorequire: bindir: bin cert_chain: [] -date: 2016-10-24 00:00:00.000000000 Z +date: 2017-07-01 00:00:00.000000000 Z dependencies: - !ruby/object:Gem::Dependency name: bundler @@ -31,14 +31,14 @@ requirements: - - "~>" - !ruby/object:Gem::Version - version: '2.11' + version: '3.6' type: :development prerelease: false version_requirements: !ruby/object:Gem::Requirement requirements: - - "~>" - !ruby/object:Gem::Version - version: '2.11' + version: '3.6' - !ruby/object:Gem::Dependency name: guard-rspec requirement: !ruby/object:Gem::Requirement @@ -53,6 +53,20 @@ - - "~>" - !ruby/object:Gem::Version version: '4.2' +- !ruby/object:Gem::Dependency + name: rake + requirement: !ruby/object:Gem::Requirement + requirements: + - - "~>" + - !ruby/object:Gem::Version + version: '12.0' + type: :development + prerelease: false + version_requirements: !ruby/object:Gem::Requirement + requirements: + - - "~>" + - !ruby/object:Gem::Version + version: '12.0' description: FSEvents API with Signals catching (without RubyCocoa) email: - thib...@thibaud.gg @@ -83,6 +97,7 @@ - ext/fsevent_watch/signal_handlers.c - ext/fsevent_watch/signal_handlers.h - ext/rakefile.rb +- lib/otnetstring.rb - lib/rb-fsevent.rb - lib/rb-fsevent/fsevent.rb - lib/rb-fsevent/version.rb @@ -90,7 +105,8 @@ homepage: http://rubygems.org/gems/rb-fsevent licenses: - MIT -metadata: {} +metadata: + source_code_uri: https://github.com/thibaudgg/rb-fsevent post_install_message: rdoc_options: [] require_paths: @@ -107,7 +123,7 @@ version: '0' requirements: [] rubyforge_project: -rubygems_version: 2.4.5.1 +rubygems_version: 2.6.11 signing_key: specification_version: 4 summary: Very simple & usable FSEvents API diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rb-fsevent.gemspec new/rb-fsevent.gemspec --- old/rb-fsevent.gemspec 2016-10-24 20:23:48.000000000 +0200 +++ new/rb-fsevent.gemspec 2017-07-01 05:41:19.000000000 +0200 @@ -13,10 +13,15 @@ s.description = 'FSEvents API with Signals catching (without RubyCocoa)' s.license = 'MIT' + s.metadata = { + 'source_code_uri' => 'https://github.com/thibaudgg/rb-fsevent' + } + s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^spec/}) } s.require_path = 'lib' s.add_development_dependency 'bundler', '~> 1.0' - s.add_development_dependency 'rspec', '~> 2.11' + s.add_development_dependency 'rspec', '~> 3.6' s.add_development_dependency 'guard-rspec', '~> 4.2' + s.add_development_dependency 'rake', '~> 12.0' end