version_sorter 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/ext/version_sorter/version_sorter.c +92 -28
- metadata +6 -7
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: ac54da2224203400008bdcc488a07f6014466645135dba8447a328b88d01a5c3
         | 
| 4 | 
            +
              data.tar.gz: fb4f9564c440553d0a5ac8a1580b3545c5d394219c9169547765d07dc3610a41
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 9e7a5716f656e8bbad48a61d8d82c2c7330b9027eb7bc7a45ce1bd6f40f0717e46515e0243a938e524ac2e024263fd84202d267ffba4efa61567f209c2e9eec0
         | 
| 7 | 
            +
              data.tar.gz: 20018a183745d8b1d139181b061307e095add6cc77e4d5120d27c93b31081120ffef00c784cada52681b4491acfca2b3db7db42b8c1cf000fccf0a36ce7a64ad
         | 
| @@ -15,6 +15,7 @@ | |
| 15 15 | 
             
            #include <ruby.h>
         | 
| 16 16 |  | 
| 17 17 | 
             
            #define min(a, b) ((a) < (b) ? (a) : (b))
         | 
| 18 | 
            +
            #define max(a, b) ((a) > (b) ? (a) : (b))
         | 
| 18 19 | 
             
            typedef int compare_callback_t(const void *, const void *);
         | 
| 19 20 |  | 
| 20 21 | 
             
            struct version_number {
         | 
| @@ -56,7 +57,8 @@ compare_version_number(const struct version_number *a, | |
| 56 57 | 
             
            			int cmp = 0;
         | 
| 57 58 |  | 
| 58 59 | 
             
            			if (num_a) {
         | 
| 59 | 
            -
            				 | 
| 60 | 
            +
            				int64_t cmp64 = (int64_t)ca->number - (int64_t)cb->number;
         | 
| 61 | 
            +
            				cmp = (int)max(-1, min(1, cmp64));
         | 
| 60 62 | 
             
            			} else {
         | 
| 61 63 | 
             
            				cmp = strchunk_cmp(
         | 
| 62 64 | 
             
            						a->original, &ca->string,
         | 
| @@ -69,6 +71,10 @@ compare_version_number(const struct version_number *a, | |
| 69 71 | 
             
            		}
         | 
| 70 72 | 
             
            	}
         | 
| 71 73 |  | 
| 74 | 
            +
            	if (max_n == 0) {
         | 
| 75 | 
            +
            		return strcmp(a->original, b->original);
         | 
| 76 | 
            +
            	}
         | 
| 77 | 
            +
             | 
| 72 78 | 
             
            	if (a->size < b->size)
         | 
| 73 79 | 
             
            		return (b->num_flags & (1ull << n)) ? -1 : 1;
         | 
| 74 80 |  | 
| @@ -138,7 +144,7 @@ parse_version_number(const char *string) | |
| 138 144 | 
             
            				version->comp[comp_n].string.len = offset - start;
         | 
| 139 145 | 
             
            			} else {
         | 
| 140 146 | 
             
            				version->comp[comp_n].number = number;
         | 
| 141 | 
            -
            				num_flags |= ( | 
| 147 | 
            +
            				num_flags |= (1ull << comp_n);
         | 
| 142 148 | 
             
            			}
         | 
| 143 149 | 
             
            			comp_n++;
         | 
| 144 150 | 
             
            			continue;
         | 
| @@ -147,10 +153,7 @@ parse_version_number(const char *string) | |
| 147 153 | 
             
            		if (string[offset] == '-' || isalpha(string[offset])) {
         | 
| 148 154 | 
             
            			uint16_t start = offset;
         | 
| 149 155 |  | 
| 150 | 
            -
            			 | 
| 151 | 
            -
            				offset++;
         | 
| 152 | 
            -
             | 
| 153 | 
            -
            			while (isalpha(string[offset]))
         | 
| 156 | 
            +
            			while (string[offset] == '-' || isalpha(string[offset]))
         | 
| 154 157 | 
             
            				offset++;
         | 
| 155 158 |  | 
| 156 159 | 
             
            			version->comp[comp_n].string.offset = start;
         | 
| @@ -169,43 +172,75 @@ parse_version_number(const char *string) | |
| 169 172 | 
             
            	return version;
         | 
| 170 173 | 
             
            }
         | 
| 171 174 |  | 
| 175 | 
            +
            struct sort_context {
         | 
| 176 | 
            +
            	VALUE rb_self;
         | 
| 177 | 
            +
            	VALUE rb_version_array;
         | 
| 178 | 
            +
            	compare_callback_t *cmp;
         | 
| 179 | 
            +
            	struct version_number **versions;
         | 
| 180 | 
            +
            };
         | 
| 181 | 
            +
             | 
| 172 182 | 
             
            static VALUE
         | 
| 173 | 
            -
             | 
| 183 | 
            +
            rb_version_sort_1_cb(VALUE arg)
         | 
| 174 184 | 
             
            {
         | 
| 175 | 
            -
            	struct  | 
| 185 | 
            +
            	struct sort_context *context = (struct sort_context *)arg;
         | 
| 176 186 | 
             
            	long length, i;
         | 
| 177 187 | 
             
            	VALUE *rb_version_ptr;
         | 
| 178 188 |  | 
| 179 | 
            -
            	 | 
| 180 | 
            -
             | 
| 181 | 
            -
            	length = RARRAY_LEN(rb_version_array);
         | 
| 182 | 
            -
            	if (!length)
         | 
| 183 | 
            -
            		return rb_ary_new();
         | 
| 184 | 
            -
             | 
| 185 | 
            -
            	versions = xcalloc(length, sizeof(struct version_number *));
         | 
| 186 | 
            -
             | 
| 189 | 
            +
            	length = RARRAY_LEN(context->rb_version_array);
         | 
| 187 190 | 
             
            	for (i = 0; i < length; ++i) {
         | 
| 188 191 | 
             
            		VALUE rb_version, rb_version_string;
         | 
| 189 192 |  | 
| 190 | 
            -
            		rb_version = rb_ary_entry(rb_version_array, i);
         | 
| 193 | 
            +
            		rb_version = rb_ary_entry(context->rb_version_array, i);
         | 
| 191 194 | 
             
            		if (rb_block_given_p())
         | 
| 192 195 | 
             
            			rb_version_string = rb_yield(rb_version);
         | 
| 193 196 | 
             
            		else
         | 
| 194 197 | 
             
            			rb_version_string = rb_version;
         | 
| 195 198 |  | 
| 196 | 
            -
            		versions[i] = parse_version_number(StringValueCStr(rb_version_string));
         | 
| 197 | 
            -
            		versions[i]->rb_version = rb_version;
         | 
| 199 | 
            +
            		context->versions[i] = parse_version_number(StringValueCStr(rb_version_string));
         | 
| 200 | 
            +
            		context->versions[i]->rb_version = rb_version;
         | 
| 201 | 
            +
            	}
         | 
| 202 | 
            +
             | 
| 203 | 
            +
            	qsort(context->versions, length, sizeof(struct version_number *), context->cmp);
         | 
| 204 | 
            +
            	rb_version_ptr = RARRAY_PTR(context->rb_version_array);
         | 
| 205 | 
            +
             | 
| 206 | 
            +
            	for (i = 0; i < length; ++i) {
         | 
| 207 | 
            +
            		rb_version_ptr[i] = context->versions[i]->rb_version;
         | 
| 198 208 | 
             
            	}
         | 
| 199 209 |  | 
| 200 | 
            -
            	 | 
| 201 | 
            -
             | 
| 210 | 
            +
            	return context->rb_version_array;
         | 
| 211 | 
            +
            }
         | 
| 212 | 
            +
             | 
| 213 | 
            +
            static VALUE
         | 
| 214 | 
            +
            rb_version_sort_1(VALUE rb_self, VALUE rb_version_array, compare_callback_t cmp)
         | 
| 215 | 
            +
            {
         | 
| 216 | 
            +
            	long length, i;
         | 
| 217 | 
            +
            	int exception;
         | 
| 218 | 
            +
             | 
| 219 | 
            +
            	Check_Type(rb_version_array, T_ARRAY);
         | 
| 220 | 
            +
             | 
| 221 | 
            +
            	length = RARRAY_LEN(rb_version_array);
         | 
| 222 | 
            +
            	if (!length)
         | 
| 223 | 
            +
            		return rb_ary_new();
         | 
| 224 | 
            +
             | 
| 225 | 
            +
            	struct sort_context context = {
         | 
| 226 | 
            +
            		rb_self,
         | 
| 227 | 
            +
            		rb_version_array,
         | 
| 228 | 
            +
            		cmp,
         | 
| 229 | 
            +
            		xcalloc(length, sizeof(struct version_number *)),
         | 
| 230 | 
            +
            	};
         | 
| 231 | 
            +
             | 
| 232 | 
            +
            	VALUE result = rb_protect(rb_version_sort_1_cb, (VALUE)&context, &exception);
         | 
| 202 233 |  | 
| 203 234 | 
             
            	for (i = 0; i < length; ++i) {
         | 
| 204 | 
            -
            		 | 
| 205 | 
            -
             | 
| 235 | 
            +
            		xfree(context.versions[i]);
         | 
| 236 | 
            +
            	}
         | 
| 237 | 
            +
            	xfree(context.versions);
         | 
| 238 | 
            +
             | 
| 239 | 
            +
            	if (exception) {
         | 
| 240 | 
            +
            		rb_jump_tag(exception);
         | 
| 206 241 | 
             
            	}
         | 
| 207 | 
            -
             | 
| 208 | 
            -
            	return  | 
| 242 | 
            +
             | 
| 243 | 
            +
            	return result;
         | 
| 209 244 | 
             
            }
         | 
| 210 245 |  | 
| 211 246 | 
             
            static VALUE
         | 
| @@ -232,12 +267,41 @@ rb_version_sort_r_bang(VALUE rb_self, VALUE rb_versions) | |
| 232 267 | 
             
            	return rb_version_sort_1(rb_self, rb_versions, version_compare_cb_r);
         | 
| 233 268 | 
             
            }
         | 
| 234 269 |  | 
| 270 | 
            +
            struct compare_context {
         | 
| 271 | 
            +
            	VALUE rb_version_a, rb_version_b;
         | 
| 272 | 
            +
            	struct version_number *version_a, *version_b;
         | 
| 273 | 
            +
            };
         | 
| 274 | 
            +
             | 
| 275 | 
            +
            static VALUE
         | 
| 276 | 
            +
            rb_version_compare_cb(VALUE arg)
         | 
| 277 | 
            +
            {
         | 
| 278 | 
            +
            	struct compare_context *context = (struct compare_context *)arg;
         | 
| 279 | 
            +
             | 
| 280 | 
            +
            	context->version_a = parse_version_number(StringValueCStr(context->rb_version_a));
         | 
| 281 | 
            +
            	context->version_b = parse_version_number(StringValueCStr(context->rb_version_b));
         | 
| 282 | 
            +
             | 
| 283 | 
            +
            	return INT2NUM(version_compare_cb(&context->version_a, &context->version_b));
         | 
| 284 | 
            +
            }
         | 
| 285 | 
            +
             | 
| 235 286 | 
             
            static VALUE
         | 
| 236 287 | 
             
            rb_version_compare(VALUE rb_self, VALUE rb_version_a, VALUE rb_version_b)
         | 
| 237 288 | 
             
            {
         | 
| 238 | 
            -
            	 | 
| 239 | 
            -
            	struct  | 
| 240 | 
            -
             | 
| 289 | 
            +
            	int exception;
         | 
| 290 | 
            +
            	struct compare_context context = {
         | 
| 291 | 
            +
            		rb_version_a, rb_version_b,
         | 
| 292 | 
            +
            		NULL, NULL,
         | 
| 293 | 
            +
            	};
         | 
| 294 | 
            +
             | 
| 295 | 
            +
            	VALUE result = rb_protect(rb_version_compare_cb, (VALUE)&context, &exception);
         | 
| 296 | 
            +
             | 
| 297 | 
            +
            	xfree(context.version_a);
         | 
| 298 | 
            +
            	xfree(context.version_b);
         | 
| 299 | 
            +
             | 
| 300 | 
            +
            	if (exception) {
         | 
| 301 | 
            +
            		rb_jump_tag(exception);
         | 
| 302 | 
            +
            	}
         | 
| 303 | 
            +
             | 
| 304 | 
            +
            	return result;
         | 
| 241 305 | 
             
            }
         | 
| 242 306 |  | 
| 243 307 | 
             
            void Init_version_sorter(void)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,15 +1,15 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: version_sorter
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Chris Wanstrath
         | 
| 8 8 | 
             
            - K. Adam Christensen
         | 
| 9 | 
            -
            autorequire: | 
| 9 | 
            +
            autorequire:
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2021-10-20 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies: []
         | 
| 14 14 | 
             
            description: VersionSorter is a C extension that does fast sorting of large sets of
         | 
| 15 15 | 
             
              version strings.
         | 
| @@ -26,7 +26,7 @@ homepage: https://github.com/github/version_sorter#readme | |
| 26 26 | 
             
            licenses:
         | 
| 27 27 | 
             
            - MIT
         | 
| 28 28 | 
             
            metadata: {}
         | 
| 29 | 
            -
            post_install_message: | 
| 29 | 
            +
            post_install_message:
         | 
| 30 30 | 
             
            rdoc_options: []
         | 
| 31 31 | 
             
            require_paths:
         | 
| 32 32 | 
             
            - lib
         | 
| @@ -41,9 +41,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 41 41 | 
             
                - !ruby/object:Gem::Version
         | 
| 42 42 | 
             
                  version: '0'
         | 
| 43 43 | 
             
            requirements: []
         | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
            signing_key: 
         | 
| 44 | 
            +
            rubygems_version: 3.2.15
         | 
| 45 | 
            +
            signing_key:
         | 
| 47 46 | 
             
            specification_version: 4
         | 
| 48 47 | 
             
            summary: Fast sorting of version strings
         | 
| 49 48 | 
             
            test_files: []
         |