]> granicus.if.org Git - jq/commitdiff
Remove -i option (#704)
authorNicolas Williams <nico@cryptonector.com>
Fri, 6 Mar 2015 03:52:02 +0000 (21:52 -0600)
committerNicolas Williams <nico@cryptonector.com>
Fri, 6 Mar 2015 03:52:02 +0000 (21:52 -0600)
In-place editing should be implemented with builtins for file I/O.

docs/content/3.manual/manual.yml
main.c
tests/run

index bab0eba31baeec833712a7a7193c16563642bc1d..02ca3caad411666d93319b6166421828700638a2 100644 (file)
@@ -174,10 +174,6 @@ sections:
 
         Like `-r` but jq won't print a newline after each output.
 
-      * `--in-place` / `-i`:
-
-        Edit the (first) file in-place.
-
       * `-f filename` / `--from-file filename`:
 
         Read filter from the file rather than from a command line, like
diff --git a/main.c b/main.c
index 77469a063e50be9ac1f7b481db20241133b96fd7..8e46b29a28d6440868ecf9dacb423eda07c170cc 100644 (file)
--- a/main.c
+++ b/main.c
@@ -38,7 +38,6 @@ static void usage(int code) {
   fprintf(f, "\t -h\t\tthis message;\n");
   fprintf(f, "\t -c\t\tcompact instead of pretty-printed output;\n");
   fprintf(f, "\t -n\t\tuse `null` as the single input value;\n");
-  fprintf(f, "\t -i\t\tedit the [first] file in-place;\n");
   fprintf(f, "\t -s\t\tread (slurp) all inputs into an array; apply filter to it;\n");
   fprintf(f, "\t -r\t\toutput raw strings, not JSON texts;\n");
   fprintf(f, "\t -R\t\tread raw strings, not JSON texts;\n");
@@ -94,11 +93,10 @@ enum {
   RAW_NO_LF             = 1024,
   UNBUFFERED_OUTPUT     = 2048,
   EXIT_STATUS           = 4096,
-  IN_PLACE              = 8192,
-  SEQ                   = 16384,
-  RUN_TESTS             = 32768,
+  SEQ                   = 8192,
+  RUN_TESTS             = 16384,
   /* debugging only */
-  DUMP_DISASM           = 65536,
+  DUMP_DISASM           = 32768,
 };
 static int options = 0;
 
@@ -151,7 +149,7 @@ int main(int argc, char* argv[]) {
   int ret = 0;
   int compiled = 0;
   int parser_flags = 0;
-  char *t = NULL;
+  int nfiles = 0;
 
   if (argc) progname = argv[0];
 
@@ -171,18 +169,17 @@ int main(int argc, char* argv[]) {
   size_t short_opts = 0;
   jv program_arguments = jv_array();
   jv lib_search_paths = jv_null();
-  char *first_file = 0;
   for (int i=1; i<argc; i++, short_opts = 0) {
     if (further_args_are_files) {
       jq_util_input_add_input(input_state, jv_string(argv[i]));
-      first_file = first_file ? first_file : argv[i];
+      nfiles++;
     } else if (!strcmp(argv[i], "--")) {
       if (!program) usage(2);
       further_args_are_files = 1;
     } else if (!isoptish(argv[i])) {
       if (program) {
         jq_util_input_add_input(input_state, jv_string(argv[i]));
-        first_file = first_file ? first_file : argv[i];
+        nfiles++;
       } else {
         program = argv[i];
       }
@@ -250,10 +247,6 @@ int main(int argc, char* argv[]) {
         options |= RAW_OUTPUT | RAW_NO_LF;
         if (!short_opts) continue;
       }
-      if (isoption(argv[i], 'i', "in-place", &short_opts)) {
-        options |= IN_PLACE;
-        if (!short_opts) continue;
-      }
       if (isoption(argv[i], 0, "seq", &short_opts)) {
         options |= SEQ;
         if (!short_opts) continue;
@@ -355,13 +348,12 @@ int main(int argc, char* argv[]) {
     }
   }
 
-  int dumpopts;
+  int dumpopts = 0;
+#ifndef WIN32
   /* Disable colour by default on Windows builds as Windows
      terminals tend not to display it correctly */
-#ifdef WIN32
-  dumpopts = 0;
-#else
-  dumpopts = isatty(fileno(stdout)) ? JV_PRINT_COLOUR : 0;
+  if (isatty(fileno(stdout)))
+    dumpopts |= JV_PRINT_COLOUR;
 #endif
   if (options & SORTED_OUTPUT) dumpopts |= JV_PRINT_SORTED;
   if (!(options & COMPACT_OUTPUT)) dumpopts |= JV_PRINT_PRETTY;
@@ -402,22 +394,6 @@ int main(int argc, char* argv[]) {
 #endif
 
   if (!program) usage(2);
-  if ((options & IN_PLACE)) {
-    if (first_file == 0) usage(2);
-    if (strcmp(first_file, "-") == 0) usage(2);
-    size_t tlen = strlen(first_file) + 7;
-    t = jv_mem_alloc(tlen);
-    int n = snprintf(t, tlen,"%sXXXXXX", first_file);
-    assert(n > 0 && (size_t)n < tlen);
-    if (mkstemp(t) == -1) {
-      fprintf(stderr, "Error: %s creating temporary file", strerror(errno));
-      exit(3);
-    }
-    if (freopen(t, "w", stdout) == NULL) {
-      fprintf(stderr, "Error: %s redirecting stdout to temporary file", strerror(errno));
-      exit(3);
-    }
-  }
 
   if ((options & PROVIDE_NULL) && (options & (RAW_INPUT | SLURP))) {
     fprintf(stderr, "%s: --null-input cannot be used with --raw-input or --slurp\n", progname);
@@ -469,8 +445,9 @@ int main(int argc, char* argv[]) {
   // Let jq program call `debug` builtin and have that go somewhere
   jq_set_debug_cb(jq, debug_cb, &dumpopts);
 
-  if (first_file == 0)
+  if (nfiles == 0)
     jq_util_input_add_input(input_state, jv_string("-"));
+
   if (options & PROVIDE_NULL) {
     ret = process(jq, jv_null(), jq_flags, dumpopts);
   } else {
@@ -502,24 +479,6 @@ int main(int argc, char* argv[]) {
   if (ret != 0)
     goto out;
 
-  if ((options & IN_PLACE)) {
-    FILE *devnull;
-#ifdef WIN32
-    devnull = freopen("NUL", "w+", stdout);
-#else
-    devnull = freopen("/dev/null", "w+", stdout);
-#endif
-    if (devnull == NULL) {
-      fprintf(stderr, "Error: %s opening /dev/null\n", strerror(errno));
-      exit(3);
-    }
-    assert(first_file != 0 && strcmp(first_file, "-") != 0);
-    if (rename(t, first_file) == -1) {
-      fprintf(stderr, "Error: %s renaming temporary file\n", strerror(errno));
-      exit(3);
-    }
-    jv_mem_free(t);
-  }
 out:
   jq_util_input_free(&input_state);
   jq_teardown(&jq);
index 3250b33a17c0866d2efaba474d801c352d871a18..bb7d07276459f3116195177ace5f2def368ff2d4 100755 (executable)
--- a/tests/run
+++ b/tests/run
@@ -129,11 +129,6 @@ EOF
 printf '1\n'|./jq -ces --seq '. == [1]' >/dev/null 2> $d/out
 cmp $d/out $d/expected
 
-$VALGRIND $Q ./jq -n '0, 1, 2' > $d/a
-$VALGRIND $Q ./jq -n '3, 4, 5' > $d/b
-$VALGRIND $Q ./jq -i '.+1' $d/a $d/b
-$VALGRIND $Q ./jq -se '. == [1,2,3,4,5,6]' $d/a
-
 ## Test streaming parser
 
 ## If we add an option to stream to the `import ... as $symbol;` directive