rugged 0.22.0b3 → 0.22.0b4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 41fe2ca17d9e55ea205e190f8d0c23ff9d6a388f
4
- data.tar.gz: 8a2e8c0501f8383b6c8ce747d212b7aa0d9a07fa
3
+ metadata.gz: c23a53921543d1466bbda19c3f6008f8977d0767
4
+ data.tar.gz: c955ad35377960f880ec4d23ea1a484705217fa0
5
5
  SHA512:
6
- metadata.gz: ca4649799366b724b65b4c257148c366f7e02545fa1834ff2eaf7742c33c4901e498d80a5ee5be1bd7b658051d3f626b2395d0ced84777cc488d1995cc1f1c51
7
- data.tar.gz: ce5ac5b5439329dd959225a6225884136b7a78a5b501502c52dee7a9cc59b9e89d5343fdb7ada26a922cd96cf4052046ba5e4576005c49e6b633638db3d3c6df
6
+ metadata.gz: 33fbe1de4ca4dffebe7519d55b3214c604cf1c76537f5731d6c862cad864571f7620207eddb9b35e0a8e746254dadd389e1f0e586f1bd23b3314ed609700825f
7
+ data.tar.gz: d4097230c3f632ac55cdd8de180dd4f18cc96a5d0761f72cbc4a4d5868062adfe30c7eb5d9c2a81aecd9b240f113a6229f9f76f237cc29d0d1d6a9ed23e5d4ce
@@ -1,3 +1,3 @@
1
1
  module Rugged
2
- Version = VERSION = '0.22.0b3'
2
+ Version = VERSION = '0.22.0b4'
3
3
  end
@@ -44,6 +44,7 @@ typedef enum {
44
44
  GIT_EAUTH = -16, /**< Authentication error */
45
45
  GIT_ECERTIFICATE = -17, /**< Server certificate is invalid */
46
46
  GIT_EAPPLIED = -18, /**< Patch/merge has already been applied */
47
+ GIT_EPEEL = -19, /**< The requested peel operation is not possible */
47
48
 
48
49
  GIT_PASSTHROUGH = -30, /**< Internal only */
49
50
  GIT_ITEROVER = -31, /**< Signals end of iteration with iterator */
@@ -202,18 +202,25 @@ GIT_EXTERN(size_t) git_object__size(git_otype type);
202
202
  /**
203
203
  * Recursively peel an object until an object of the specified type is met.
204
204
  *
205
- * The retrieved `peeled` object is owned by the repository and should be
206
- * closed with the `git_object_free` method.
205
+ * If the query cannot be satisfied due to the object model,
206
+ * GIT_EINVALIDSPEC will be returned (e.g. trying to peel a blob to a
207
+ * tree).
207
208
  *
208
- * If you pass `GIT_OBJ_ANY` as the target type, then the object will be
209
- * peeled until the type changes (e.g. a tag will be chased until the
210
- * referenced object is no longer a tag).
209
+ * If you pass `GIT_OBJ_ANY` as the target type, then the object will
210
+ * be peeled until the type changes. A tag will be peeled until the
211
+ * referenced object is no longer a tag, and a commit will be peeled
212
+ * to a tree. Any other object type will return GIT_EINVALIDSPEC.
213
+ *
214
+ * If peeling a tag we discover an object which cannot be peeled to
215
+ * the target type due to the object model, GIT_EPEEL will be
216
+ * returned.
217
+ *
218
+ * You must free the returned object.
211
219
  *
212
220
  * @param peeled Pointer to the peeled git_object
213
221
  * @param object The object to be processed
214
- * @param target_type The type of the requested object (GIT_OBJ_COMMIT,
215
- * GIT_OBJ_TAG, GIT_OBJ_TREE, GIT_OBJ_BLOB or GIT_OBJ_ANY).
216
- * @return 0 on success, GIT_EAMBIGUOUS, GIT_ENOTFOUND or an error code
222
+ * @param target_type The type of the requested object (a GIT_OBJ_ value)
223
+ * @return 0 on success, GIT_EINVALIDSPEC, GIT_EPEEL, or an error code
217
224
  */
218
225
  GIT_EXTERN(int) git_object_peel(
219
226
  git_object **peeled,
@@ -103,7 +103,6 @@ int git_attr_file__load(
103
103
  int error = 0;
104
104
  git_blob *blob = NULL;
105
105
  git_buf content = GIT_BUF_INIT;
106
- const char *data = NULL;
107
106
  git_attr_file *file;
108
107
  struct stat st;
109
108
 
@@ -120,7 +119,9 @@ int git_attr_file__load(
120
119
  (error = git_blob_lookup(&blob, repo, &id)) < 0)
121
120
  return error;
122
121
 
123
- data = git_blob_rawcontent(blob);
122
+ /* Do not assume that data straight from the ODB is NULL-terminated;
123
+ * copy the contents of a file to a buffer to work on */
124
+ git_buf_put(&content, git_blob_rawcontent(blob), git_blob_rawsize(blob));
124
125
  break;
125
126
  }
126
127
  case GIT_ATTR_FILE__FROM_FILE: {
@@ -143,7 +144,6 @@ int git_attr_file__load(
143
144
  if (error < 0)
144
145
  return GIT_ENOTFOUND;
145
146
 
146
- data = content.ptr;
147
147
  break;
148
148
  }
149
149
  default:
@@ -154,7 +154,7 @@ int git_attr_file__load(
154
154
  if ((error = git_attr_file__new(&file, entry, source)) < 0)
155
155
  goto cleanup;
156
156
 
157
- if (parser && (error = parser(repo, file, data)) < 0) {
157
+ if (parser && (error = parser(repo, file, git_buf_cstr(&content))) < 0) {
158
158
  git_attr_file__free(file);
159
159
  goto cleanup;
160
160
  }
@@ -143,6 +143,7 @@ int git_buf_text_lf_to_crlf(git_buf *tgt, const git_buf *src)
143
143
  tgt->ptr[tgt->size++] = '\n';
144
144
  }
145
145
 
146
+ tgt->ptr[tgt->size] = '\0';
146
147
  return git_buf_put(tgt, scan, end - scan);
147
148
  }
148
149
 
@@ -176,10 +176,13 @@ int git_buf_putcn(git_buf *buf, char c, size_t len)
176
176
 
177
177
  int git_buf_put(git_buf *buf, const char *data, size_t len)
178
178
  {
179
- ENSURE_SIZE(buf, buf->size + len + 1);
180
- memmove(buf->ptr + buf->size, data, len);
181
- buf->size += len;
182
- buf->ptr[buf->size] = '\0';
179
+ if (len) {
180
+ assert(data);
181
+ ENSURE_SIZE(buf, buf->size + len + 1);
182
+ memmove(buf->ptr + buf->size, data, len);
183
+ buf->size += len;
184
+ buf->ptr[buf->size] = '\0';
185
+ }
183
186
  return 0;
184
187
  }
185
188
 
@@ -1234,7 +1234,7 @@ int git_diff_tree_to_workdir(
1234
1234
 
1235
1235
  assert(diff && repo);
1236
1236
 
1237
- if ((error = git_repository_index(&index, repo)))
1237
+ if ((error = git_repository_index__weakptr(&index, repo)))
1238
1238
  return error;
1239
1239
 
1240
1240
  DIFF_FROM_ITERATORS(
@@ -1243,7 +1243,6 @@ int git_diff_tree_to_workdir(
1243
1243
  &b, repo, index, old_tree, GIT_ITERATOR_DONT_AUTOEXPAND, pfx, pfx)
1244
1244
  );
1245
1245
 
1246
- git_index_free(index);
1247
1246
  return error;
1248
1247
  }
1249
1248
 
@@ -120,6 +120,7 @@ int git_indexer_new(
120
120
  idx->progress_cb = progress_cb;
121
121
  idx->progress_payload = progress_payload;
122
122
  idx->mode = mode ? mode : GIT_PACK_FILE_MODE;
123
+ git_hash_ctx_init(&idx->hash_ctx);
123
124
  git_hash_ctx_init(&idx->trailer);
124
125
 
125
126
  error = git_buf_joinpath(&path, prefix, suff);
@@ -265,7 +266,6 @@ static int store_object(git_indexer *idx)
265
266
  struct entry *entry;
266
267
  git_off_t entry_size;
267
268
  struct git_pack_entry *pentry;
268
- git_hash_ctx *ctx = &idx->hash_ctx;
269
269
  git_off_t entry_start = idx->entry_start;
270
270
 
271
271
  entry = git__calloc(1, sizeof(*entry));
@@ -274,7 +274,7 @@ static int store_object(git_indexer *idx)
274
274
  pentry = git__calloc(1, sizeof(struct git_pack_entry));
275
275
  GITERR_CHECK_ALLOC(pentry);
276
276
 
277
- git_hash_final(&oid, ctx);
277
+ git_hash_final(&oid, &idx->hash_ctx);
278
278
  entry_size = idx->off - entry_start;
279
279
  if (entry_start > UINT31_MAX) {
280
280
  entry->offset = UINT32_MAX;
@@ -557,7 +557,7 @@ int git_indexer_append(git_indexer *idx, const void *data, size_t size, git_tran
557
557
 
558
558
  git_mwindow_close(&w);
559
559
  idx->entry_start = entry_start;
560
- git_hash_ctx_init(&idx->hash_ctx);
560
+ git_hash_init(&idx->hash_ctx);
561
561
 
562
562
  if (type == GIT_OBJ_REF_DELTA || type == GIT_OBJ_OFS_DELTA) {
563
563
  error = advance_delta_offset(idx, type);
@@ -671,8 +671,10 @@ static int inject_object(git_indexer *idx, git_oid *id)
671
671
  seek_back_trailer(idx);
672
672
  entry_start = idx->pack->mwf.size;
673
673
 
674
- if (git_odb_read(&obj, idx->odb, id) < 0)
674
+ if (git_odb_read(&obj, idx->odb, id) < 0) {
675
+ giterr_set(GITERR_INDEXER, "missing delta bases");
675
676
  return -1;
677
+ }
676
678
 
677
679
  data = git_odb_object_data(obj);
678
680
  len = git_odb_object_size(obj);
@@ -827,7 +829,6 @@ static int resolve_deltas(git_indexer *idx, git_transfer_progress *stats)
827
829
  break;
828
830
 
829
831
  if (!progressed && (fix_thin_pack(idx, stats) < 0)) {
830
- giterr_set(GITERR_INDEXER, "missing delta bases");
831
832
  return -1;
832
833
  }
833
834
  }
@@ -843,12 +844,10 @@ static int update_header_and_rehash(git_indexer *idx, git_transfer_progress *sta
843
844
  git_mwindow *w = NULL;
844
845
  git_mwindow_file *mwf;
845
846
  unsigned int left;
846
- git_hash_ctx *ctx;
847
847
 
848
848
  mwf = &idx->pack->mwf;
849
- ctx = &idx->trailer;
850
849
 
851
- git_hash_ctx_init(ctx);
850
+ git_hash_init(&idx->trailer);
852
851
 
853
852
 
854
853
  /* Update the header to include the numer of local objects we injected */
@@ -1061,5 +1060,7 @@ void git_indexer_free(git_indexer *idx)
1061
1060
  git_mutex_unlock(&git__mwindow_mutex);
1062
1061
  }
1063
1062
 
1063
+ git_hash_ctx_cleanup(&idx->trailer);
1064
+ git_hash_ctx_cleanup(&idx->hash_ctx);
1064
1065
  git__free(idx);
1065
1066
  }
@@ -1418,6 +1418,7 @@ static void workdir_iterator__free(git_iterator *self)
1418
1418
  workdir_iterator *wi = (workdir_iterator *)self;
1419
1419
  if (wi->index)
1420
1420
  git_index_snapshot_release(&wi->index_snapshot, wi->index);
1421
+ git_tree_free(wi->tree);
1421
1422
  fs_iterator__free(self);
1422
1423
  git_ignore__free(&wi->ignores);
1423
1424
  }
@@ -323,11 +323,10 @@ static int note_new(
323
323
  git_signature_dup(&note->committer, git_commit_committer(commit)) < 0)
324
324
  return -1;
325
325
 
326
- note->message = git__strdup((char *)git_blob_rawcontent(blob));
326
+ note->message = git__strndup(git_blob_rawcontent(blob), git_blob_rawsize(blob));
327
327
  GITERR_CHECK_ALLOC(note->message);
328
328
 
329
329
  *out = note;
330
-
331
330
  return 0;
332
331
  }
333
332
 
@@ -277,10 +277,8 @@ static int dereference_object(git_object **dereferenced, git_object *obj)
277
277
  return git_tag_target(dereferenced, (git_tag*)obj);
278
278
 
279
279
  case GIT_OBJ_BLOB:
280
- return GIT_ENOTFOUND;
281
-
282
280
  case GIT_OBJ_TREE:
283
- return GIT_EAMBIGUOUS;
281
+ return GIT_EPEEL;
284
282
 
285
283
  default:
286
284
  return GIT_EINVALIDSPEC;
@@ -303,6 +301,32 @@ static int peel_error(int error, const git_oid *oid, git_otype type)
303
301
  return error;
304
302
  }
305
303
 
304
+ static int check_type_combination(git_otype type, git_otype target)
305
+ {
306
+ if (type == target)
307
+ return 0;
308
+
309
+ switch (type) {
310
+ case GIT_OBJ_BLOB:
311
+ case GIT_OBJ_TREE:
312
+ /* a blob or tree can never be peeled to anything but themselves */
313
+ return GIT_EINVALIDSPEC;
314
+ break;
315
+ case GIT_OBJ_COMMIT:
316
+ /* a commit can only be peeled to a tree */
317
+ if (target != GIT_OBJ_TREE && target != GIT_OBJ_ANY)
318
+ return GIT_EINVALIDSPEC;
319
+ break;
320
+ case GIT_OBJ_TAG:
321
+ /* a tag may point to anything, so we let anything through */
322
+ break;
323
+ default:
324
+ return GIT_EINVALIDSPEC;
325
+ }
326
+
327
+ return 0;
328
+ }
329
+
306
330
  int git_object_peel(
307
331
  git_object **peeled,
308
332
  const git_object *object,
@@ -313,15 +337,18 @@ int git_object_peel(
313
337
 
314
338
  assert(object && peeled);
315
339
 
316
- if (git_object_type(object) == target_type)
317
- return git_object_dup(peeled, (git_object *)object);
318
-
319
340
  assert(target_type == GIT_OBJ_TAG ||
320
341
  target_type == GIT_OBJ_COMMIT ||
321
342
  target_type == GIT_OBJ_TREE ||
322
343
  target_type == GIT_OBJ_BLOB ||
323
344
  target_type == GIT_OBJ_ANY);
324
345
 
346
+ if ((error = check_type_combination(git_object_type(object), target_type)) < 0)
347
+ return peel_error(error, git_object_id(object), target_type);
348
+
349
+ if (git_object_type(object) == target_type)
350
+ return git_object_dup(peeled, (git_object *)object);
351
+
325
352
  source = (git_object *)object;
326
353
 
327
354
  while (!(error = dereference_object(&deref, source))) {
@@ -408,11 +408,14 @@ static int packfile_unpack_header1(
408
408
  size = c & 15;
409
409
  shift = 4;
410
410
  while (c & 0x80) {
411
- if (len <= used)
411
+ if (len <= used) {
412
+ giterr_set(GITERR_ODB, "buffer too small");
412
413
  return GIT_EBUFS;
414
+ }
413
415
 
414
416
  if (bitsizeof(long) <= shift) {
415
417
  *usedp = 0;
418
+ giterr_set(GITERR_ODB, "packfile corrupted");
416
419
  return -1;
417
420
  }
418
421
 
@@ -995,6 +995,7 @@ static int remote_head_for_ref(git_remote_head **out, git_remote *remote, git_re
995
995
  error = remote_head_for_fetchspec_src(out, update_heads, git_buf_cstr(&remote_name));
996
996
 
997
997
  cleanup:
998
+ git_buf_free(&remote_name);
998
999
  git_reference_free(resolved_ref);
999
1000
  git_config_free(config);
1000
1001
  return error;
@@ -124,7 +124,7 @@ static int push_commit(git_revwalk *walk, const git_oid *oid, int uninteresting,
124
124
  error = git_object_peel(&obj, oobj, GIT_OBJ_COMMIT);
125
125
  git_object_free(oobj);
126
126
 
127
- if (error == GIT_ENOTFOUND) {
127
+ if (error == GIT_ENOTFOUND || error == GIT_EINVALIDSPEC || error == GIT_EPEEL) {
128
128
  /* If this comes from e.g. push_glob("tags"), ignore this */
129
129
  if (from_glob)
130
130
  return 0;
@@ -47,6 +47,17 @@ static void free_head(git_remote_head *head)
47
47
  git__free(head);
48
48
  }
49
49
 
50
+ static void free_heads(git_vector *heads)
51
+ {
52
+ git_remote_head *head;
53
+ size_t i;
54
+
55
+ git_vector_foreach(heads, i, head)
56
+ free_head(head);
57
+
58
+ git_vector_free(heads);
59
+ }
60
+
50
61
  static int add_ref(transport_local *t, const char *name)
51
62
  {
52
63
  const char peeled[] = "^{}";
@@ -198,6 +209,8 @@ static int local_connect(
198
209
  if (t->connected)
199
210
  return 0;
200
211
 
212
+ free_heads(&t->refs);
213
+
201
214
  t->url = git__strdup(url);
202
215
  GITERR_CHECK_ALLOC(t->url);
203
216
  t->direction = direction;
@@ -624,13 +637,8 @@ static int local_close(git_transport *transport)
624
637
  static void local_free(git_transport *transport)
625
638
  {
626
639
  transport_local *t = (transport_local *)transport;
627
- size_t i;
628
- git_remote_head *head;
629
640
 
630
- git_vector_foreach(&t->refs, i, head)
631
- free_head(head);
632
-
633
- git_vector_free(&t->refs);
641
+ free_heads(&t->refs);
634
642
 
635
643
  /* Close the transport, if it's still open. */
636
644
  local_close(transport);
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rugged
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.0b3
4
+ version: 0.22.0b4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Scott Chacon