static int cat_one_file(int opt, const char *exp_type, const char *obj_name) { unsigned char sha1[20]; enum object_type type; void *buf; unsigned long size; if (get_sha1(obj_name, sha1)) die("Not a valid object name %s", obj_name); buf = NULL; switch (opt) { case 't': type = sha1_object_info(sha1, NULL); if (type > 0) { printf("%s\n", typename(type)); return 0; } break; case 's': type = sha1_object_info(sha1, &size); if (type > 0) { printf("%lu\n", size); return 0; } break; case 'e': return !has_sha1_file(sha1); case 'p': type = sha1_object_info(sha1, NULL); if (type < 0) die("Not a valid object name %s", obj_name); /* custom pretty-print here */ if (type == OBJ_TREE) { const char *ls_args[3] = {"ls-tree", obj_name, NULL}; return cmd_ls_tree(2, ls_args, NULL); } buf = read_sha1_file(sha1, &type, &size); if (!buf) die("Cannot read object %s", obj_name); if (type == OBJ_TAG) { pprint_tag(sha1, buf, size); return 0; } /* otherwise just spit out the data */ break; case 0: buf = read_object_with_reference(sha1, exp_type, &size, NULL); break; default: die("git cat-file: unknown option: %s", exp_type); }
int cmd_cat_file(int argc, const char **argv) { /* Uncomment when it passes the tests */ please_git_do_it_for_me(); char opt; if (argc != 2 && argc !=3) please_git_do_it_for_me(); if (argc == 3){ if ((strcmp(argv[1], "blob") == 0) || (strcmp(argv[1], "tree") == 0) || (strcmp(argv[1], "commit") == 0) || (strcmp(argv[1], "tag") == 0 )) opt = '0'; else opt = argv[1][1]; } else if (argc == 2 && (strcmp(argv[1], "--batch") == 0)) opt = 'a'; git_repository *repo = get_git_repository(); git_oid oid; if (git_oid_fromstr(&oid, (const char *)argv[argc-1])) please_git_do_it_for_me(); git_odb *odb; git_repository_odb(&odb, repo); git_odb_object *odb_object; if(git_odb_read(&odb_object, odb, &oid) == GIT_ENOTFOUND) libgit_error(); size_t size = git_odb_object_size(odb_object); git_otype type = git_odb_object_type(odb_object); const char *type_string = git_object_type2string(type); switch (opt) { case 'p': if (strcmp(type_string, "tree") == 0) { printf("vous etes là\n"); char ** arg = malloc(2); strcpy(arg[0], "ls-tree"); strcpy(arg[1], argv[2]); int e = cmd_ls_tree(2, (const char **)arg); if (e == 0 ) printf("succes\n"); else printf("echec\n"); } else { for(int i=0; i < (int)size; i++) printf("%c", *((char *)git_odb_object_data(odb_object)+i)); } break; case 't': printf("%s\n",type_string); break; case 's': printf("%zu\n",size); break; case 'e': if(git_odb_exists(odb, &oid) == 1) { return 0; } break; case '0' : if (strcmp(type_string, argv[1]) == 0) { for (int i=0; i < (int)size; i++) printf("%c", *((char *)git_odb_object_data(odb_object)+i)); } else please_git_do_it_for_me(); break; case 'a' : please_git_do_it_for_me(); // if (strbuf_read(&buf, 0, 4096) < 0) // die_errno("could not read from stdin"); // // git_oid id; // if (git_oid_mkstr(&id, buf.buf)) // please_git_do_it_for_me(); // // git_odb_object *odb_object1; // if(git_odb_read(&odb_object1, odb, &id) == GIT_ENOTFOUND) // libgit_error(); // size_t size1 = git_odb_object_size(odb_object1); // git_otype type1 = git_odb_object_type(odb_object1); // // printf("bla bla %s %s %zu\n",buf.buf, git_object_type2string(type1), size1); // for(int i=0; i < (int)size1; i++) // printf("%c", *((char *)git_odb_object_data(odb_object1)+i)); // fflush(stdout); break; } //git_odb_object_close(odb_object); return EXIT_SUCCESS; }
static int cat_one_file(int opt, const char *exp_type, const char *obj_name) { unsigned char sha1[20]; enum object_type type; char *buf; unsigned long size; struct object_context obj_context; if (get_sha1_with_context(obj_name, 0, sha1, &obj_context)) die("Not a valid object name %s", obj_name); buf = NULL; switch (opt) { case 't': type = sha1_object_info(sha1, NULL); if (type > 0) { printf("%s\n", typename(type)); return 0; } break; case 's': type = sha1_object_info(sha1, &size); if (type > 0) { printf("%lu\n", size); return 0; } break; case 'e': return !has_sha1_file(sha1); case 'p': type = sha1_object_info(sha1, NULL); if (type < 0) die("Not a valid object name %s", obj_name); /* custom pretty-print here */ if (type == OBJ_TREE) { const char *ls_args[3] = { NULL }; ls_args[0] = "ls-tree"; ls_args[1] = obj_name; return cmd_ls_tree(2, ls_args, NULL); } if (type == OBJ_BLOB) return stream_blob_to_fd(1, sha1, NULL, 0); buf = read_sha1_file(sha1, &type, &size); if (!buf) die("Cannot read object %s", obj_name); if (type == OBJ_TAG) { pprint_tag(sha1, buf, size); return 0; } /* otherwise just spit out the data */ break; case 'c': if (!obj_context.path[0]) die("git cat-file --textconv %s: <object> must be <sha1:path>", obj_name); if (!textconv_object(obj_context.path, obj_context.mode, sha1, 1, &buf, &size)) die("git cat-file --textconv: unable to run textconv on %s", obj_name); break; case 0: if (type_from_string(exp_type) == OBJ_BLOB) { unsigned char blob_sha1[20]; if (sha1_object_info(sha1, NULL) == OBJ_TAG) { enum object_type type; unsigned long size; char *buffer = read_sha1_file(sha1, &type, &size); if (memcmp(buffer, "object ", 7) || get_sha1_hex(buffer + 7, blob_sha1)) die("%s not a valid tag", sha1_to_hex(sha1)); free(buffer); } else hashcpy(blob_sha1, sha1); if (sha1_object_info(blob_sha1, NULL) == OBJ_BLOB) return stream_blob_to_fd(1, blob_sha1, NULL, 0); /* * we attempted to dereference a tag to a blob * and failed; there may be new dereference * mechanisms this code is not aware of. * fall-back to the usual case. */ } buf = read_object_with_reference(sha1, exp_type, &size, NULL); break; default: die("git cat-file: unknown option: %s", exp_type); }
static int cat_one_file(int opt, const char *exp_type, const char *obj_name) { unsigned char sha1[20]; enum object_type type; char *buf; unsigned long size; struct object_context obj_context; if (get_sha1_with_context(obj_name, sha1, &obj_context)) die("Not a valid object name %s", obj_name); buf = NULL; switch (opt) { case 't': type = sha1_object_info(sha1, NULL); if (type > 0) { printf("%s\n", typename(type)); return 0; } break; case 's': type = sha1_object_info(sha1, &size); if (type > 0) { printf("%lu\n", size); return 0; } break; case 'e': return !has_sha1_file(sha1); case 'p': type = sha1_object_info(sha1, NULL); if (type < 0) die("Not a valid object name %s", obj_name); /* custom pretty-print here */ if (type == OBJ_TREE) { const char *ls_args[3] = { NULL }; ls_args[0] = "ls-tree"; ls_args[1] = obj_name; return cmd_ls_tree(2, ls_args, NULL); } buf = read_sha1_file(sha1, &type, &size); if (!buf) die("Cannot read object %s", obj_name); if (type == OBJ_TAG) { pprint_tag(sha1, buf, size); return 0; } /* otherwise just spit out the data */ break; case 'c': if (!obj_context.path[0]) die("git cat-file --textconv %s: <object> must be <sha1:path>", obj_name); if (!textconv_object(obj_context.path, sha1, &buf, &size)) die("git cat-file --textconv: unable to run textconv on %s", obj_name); break; case 0: buf = read_object_with_reference(sha1, exp_type, &size, NULL); break; default: die("git cat-file: unknown option: %s", exp_type); }