Ben Collins-Sussman wrote:
> 
> Blair Zajac <blair@orcaware.com> writes:
> 
> > It would be handy to have svn status have a command line option
> > to ignore the svn:ignore setting.
> 
> +1.  Go for it.
Could somebody review this?  I'll submit it myself to raise my
score in the Karl Fogel commit race!
Best,
Blair
-- 
Blair Zajac <blair@orcaware.com>
Web and OS performance plots - http://www.orcaware.com/orca/
Add --no-ignore command line option to svn status to disregard svn's
default ignore list and any svn:ignore properties.
* subversion/include/svn_wc.h (svn_wc_statuses):
  New argument svn_boolean_t no_ignore.
* subversion/include/svn_client.h (svn_client_status):
  New argument svn_boolean_t no_ignore.
* subversion/libsvn_wc/status.c
  (add_unversioned_items):
    New argument svn_boolean_t no_ignore and test it whether to use
      default ignore regular expressions and svn:ignore properties.
  (svn_wc_statuses):
    New argument svn_boolean_t no_ignore and pass it to itself on
      recursion and to add_unversioned_items.
* subversion/libsvn_client/delete.c
  (svn_client__can_delete):
    Pass FALSE for svn_wc_statuses new no_ignore argument.
* subversion/libsvn_client/status.c
  (svn_client_status):
    New argument svn_boolean_t no_ignore and pass down to
      svn_wc_statuses.
* subversion/clients/cmdline/cl.h:
  Add svn_cl__no_ignore_opt to svn_cl__longopt_t.
* subversion/clients/cmdline/status-cmd.c (svn_cl__status):
  Pass no_ignore command line option setting down to
    svn_client_status.
* subversion/clients/cmdline/main.c:
  Add "no-ignore" to svn_cl__options and to valid 'status' command
    line options.
  (main): Set opt_state.no_ignore appropriately.
* subversion/clients/cmdline/status-cmd.c
  (svn_cl__status):
    Take command line option no_ignore flag and pass down to
      svn_client_status.
* subversion/libsvn_client/status.c
  (svn_client_status):
    Take no_ignore flag and pass it down to svn_wc_statuses.
* doc/handbook/client.texi (Examine your changes):
  List svn's default list of ignore regular expressions.
  Document svn status' --no-ignore command line option.
Index: ./subversion/include/svn_wc.h
===================================================================
--- ./subversion/include/svn_wc.h
+++ ./subversion/include/svn_wc.h	Fri Jul 26 15:31:23 2002
@@ -505,17 +505,18 @@
 /* Fill *STATUS for PATH, allocating in POOL, with the exception of
    the repos_rev field, which is normally filled in by the caller. 
 
    Here are some things to note about the returned structure.  A quick
    examination of the STATUS->text_status after a successful return of
    this function can reveal the following things:
 
       svn_wc_status_none : PATH is not versioned, and is either not
-                           present on disk, or is ignored by the
+                           present on disk, or is ignored by svn's
+                           default ignore regular expressions or the
                            svn:ignore property setting for PATH's
                            parent directory.
 
       svn_wc_status_absent : PATH is versioned, but is missing from
                              the working copy.
 
       svn_wc_status_unversioned : PATH is not versioned, but is
                                   present on disk and not being
@@ -556,16 +557,17 @@
  * If DESCEND is non-zero, statushash will contain statuses for PATH
  * and everything below it, including subdirectories.  In other
  * words, a full recursion.  */
 svn_error_t *svn_wc_statuses (apr_hash_t *statushash,
                               const char *path,
                               svn_boolean_t descend,
                               svn_boolean_t get_all,
                               svn_boolean_t strict,
+                              svn_boolean_t no_ignore,
                               apr_pool_t *pool);
 
 
 /* Set  *EDITOR and *EDIT_BATON to an editor that tweaks or adds
    svn_wc_status_t structures to STATUSHASH to reflect repository
    modifications that would be received on update, and that sets
    *YOUNGEST to the youngest revision in the repository (the editor
    also sets the repos_rev field in each svn_wc_status_t structure
Index: ./subversion/include/svn_client.h
===================================================================
--- ./subversion/include/svn_client.h
+++ ./subversion/include/svn_client.h	Fri Jul 26 15:10:38 2002
@@ -527,16 +527,17 @@
 svn_error_t *
 svn_client_status (apr_hash_t **statushash,
                    svn_revnum_t *youngest,  /* only touched if `update' set */
                    const char *path,
                    svn_client_auth_baton_t *auth_baton,
                    svn_boolean_t descend,
                    svn_boolean_t get_all,
                    svn_boolean_t update,
+                   svn_boolean_t no_ignore,
                    apr_pool_t *pool);
 
 
 /* Invoke RECEIVER with RECEIVER_BATON on each log message from START
    to END in turn, inclusive (but never invoke RECEIVER on a given log
    message more than once).
   
    TARGETS contains all the working copy paths (as const char *'s)
Index: ./subversion/libsvn_wc/status.c
===================================================================
--- ./subversion/libsvn_wc/status.c
+++ ./subversion/libsvn_wc/status.c	Fri Jul 26 15:51:59 2002
@@ -284,30 +284,34 @@
 
 /* Add all items that are NOT in ENTRIES (which is a list of PATH's
    versioned things) to the STATUSHASH as unversioned items,
    allocating everything in POOL. */
 static svn_error_t *
 add_unversioned_items (const char *path, 
                        apr_hash_t *entries,
                        apr_hash_t *statushash,
+                       svn_boolean_t no_ignore,
                        apr_pool_t *pool)
 {
   apr_pool_t *subpool = svn_pool_create (pool);
   apr_hash_t *dirents;
   apr_hash_index_t *hi;
   apr_array_header_t *patterns;
 
   /* Read PATH's dirents. */
   SVN_ERR (svn_io_get_dirents (&dirents, path, subpool));
 
-  /* Try to load any '.svnignore' file that may be present. */
+  /* Try to add any svn:ignore properties on the parent directory. */
   patterns = apr_array_make (subpool, 1, sizeof(const char *));
-  add_default_ignores (patterns);
-  SVN_ERR (add_ignore_patterns (path, patterns, subpool));
+  if (! no_ignore)
+    {
+      add_default_ignores (patterns);
+      SVN_ERR (add_ignore_patterns (path, patterns, subpool));
+    }
 
   /* Add empty status structures for each of the unversioned things. */
   for (hi = apr_hash_first (subpool, dirents); hi; hi = apr_hash_next (hi))
     {
       const void *key;
       apr_ssize_t klen;
       void *val;
       const char *keystring;
@@ -389,16 +393,17 @@
 
 
 svn_error_t *
 svn_wc_statuses (apr_hash_t *statushash,
                  const char *path,
                  svn_boolean_t descend,
                  svn_boolean_t get_all,
                  svn_boolean_t strict,
+                 svn_boolean_t no_ignore,
                  apr_pool_t *pool)
 {
   enum svn_node_kind kind;
   svn_wc_entry_t *entry;
 
   /* Is PATH a directory or file? */
   SVN_ERR (svn_io_check_path (path, &kind, pool));
   
@@ -445,17 +450,18 @@
         return svn_error_createf
           (SVN_ERR_WC_NOT_DIRECTORY, 0, NULL, pool,
            "svn_wc_statuses: %s is not a working copy directory", path);
 
       /* Load entries file for the directory into the requested pool. */
       SVN_ERR (svn_wc_entries_read (&entries, path, FALSE, pool));
 
       /* Add the unversioned items to the status output. */
-      SVN_ERR (add_unversioned_items (path, entries, statushash, pool));
+      SVN_ERR (add_unversioned_items (path, entries, statushash,
+                                      no_ignore, pool));
 
       /* Loop over entries hash */
       for (hi = apr_hash_first (pool, entries); hi; hi = apr_hash_next (hi))
         {
           const void *key;
           void *val;
           const char *base_name;
 
@@ -503,18 +509,19 @@
                      their full entry from their own THIS_DIR entry.
                      svn_wc_entry does this for us if it can.  */
                   svn_wc_entry_t *subdir;
 
                   SVN_ERR (svn_wc_entry (&subdir, fullpath, FALSE, pool));
                   SVN_ERR (add_status_structure (statushash, fullpath,
                                                  subdir, get_all, 
                                                  strict, pool));
-                  SVN_ERR (svn_wc_statuses (statushash, fullpath,
-                                            descend, get_all, strict, pool)); 
+                  SVN_ERR (svn_wc_statuses (statushash, fullpath, descend,
+                                            get_all, strict, no_ignore,
+                                            pool)); 
                 }
               else if ((kind == svn_node_file) || (kind == svn_node_none))
                 {
                   /* File entries are ... just fine! */
                   SVN_ERR (add_status_structure (statushash, fullpath,
                                                  entry, get_all, 
                                                  strict, pool));
                 }
Index: ./subversion/libsvn_client/delete.c
===================================================================
--- ./subversion/libsvn_client/delete.c
+++ ./subversion/libsvn_client/delete.c	Fri Jul 26 14:57:23 2002
@@ -37,17 +37,17 @@
 
 svn_error_t *
 svn_client__can_delete (const char *path,
                         apr_pool_t *pool)
 {
   apr_hash_t *hash = apr_hash_make (pool);
   apr_hash_index_t *hi;
 
-  SVN_ERR (svn_wc_statuses (hash, path, TRUE, FALSE, TRUE, pool));
+  SVN_ERR (svn_wc_statuses (hash, path, TRUE, FALSE, TRUE, FALSE, pool));
   for (hi = apr_hash_first (pool, hash); hi; hi = apr_hash_next (hi))
     {
       const void *key;
       void *val;
       const char *name;
       const svn_wc_status_t *statstruct;
 
       apr_hash_this (hi, &key, NULL, &val);
Index: ./subversion/libsvn_client/status.c
===================================================================
--- ./subversion/libsvn_client/status.c
+++ ./subversion/libsvn_client/status.c	Fri Jul 26 15:59:43 2002
@@ -141,16 +141,17 @@
 svn_error_t *
 svn_client_status (apr_hash_t **statushash,
                    svn_revnum_t *youngest,
                    const char *path,
                    svn_client_auth_baton_t *auth_baton,
                    svn_boolean_t descend,
                    svn_boolean_t get_all,
                    svn_boolean_t update,
+                   svn_boolean_t no_ignore,
                    apr_pool_t *pool)
 {
   apr_hash_t *hash = apr_hash_make (pool);
   svn_boolean_t strict;
 
   /* If we're not updating, we might be getting new paths from the
      repository, and we don't want svn_wc_statuses to error on these
      paths. However, if we're not updating and we see a path that
@@ -159,20 +160,21 @@
     strict = FALSE;
   else
     strict = TRUE;
 
   /* Ask the wc to give us a list of svn_wc_status_t structures.
      These structures contain nothing but information found in the
      working copy.
 
-     Pass the GET_ALL and DESCEND flags;  this working copy function
-     understands these flags too, and will return the correct set of
-     structures.  */
-  SVN_ERR (svn_wc_statuses (hash, path, descend, get_all, strict, pool));
+     Pass the GET_ALL, DESCEND and NO_IGNORE flags;  this working copy
+     function understands these flags too, and will return the correct
+     set of structures.  */
+  SVN_ERR (svn_wc_statuses (hash, path, descend, get_all,
+                            strict, no_ignore, pool));
 
 
   /* If the caller wants us to contact the repository also... */
   if (update)    
     /* Add "dry-run" update information to our existing structures.
        (Pass the DESCEND flag here, since we may want to ignore update
        info that is below PATH.)  */
     SVN_ERR (add_update_info_to_status_hash (hash, youngest, path,
Index: ./subversion/clients/cmdline/cl.h
===================================================================
--- ./subversion/clients/cmdline/cl.h
+++ ./subversion/clients/cmdline/cl.h	Fri Jul 26 15:36:46 2002
@@ -46,17 +46,18 @@
   svn_cl__ancestor_path_opt,
   svn_cl__force_opt,
   svn_cl__msg_encoding_opt,
   svn_cl__version_opt,
   svn_cl__auth_username_opt,
   svn_cl__auth_password_opt,
   svn_cl__targets_opt,
   svn_cl__xml_opt,
-  svn_cl__strict_opt
+  svn_cl__strict_opt,
+  svn_cl__no_ignore_opt,
 } svn_cl__longopt_t;
 
 
 
 /*** Command dispatch. ***/
 
 /* Hold results of option processing that are shared by multiple
    commands. */
@@ -85,16 +86,17 @@
   svn_stringbuf_t *filedata;     /* contents of file used as option data */
   const char *filedata_encoding; /* the locale/encoding of the filedata*/
   svn_boolean_t help;            /* print usage message */
   const char *auth_username;     /* auth username */ /* UTF-8! */
   const char *auth_password;     /* auth password */ /* UTF-8! */
   const char *extensions;        /* subprocess extension args */ /* UTF-8! */
   apr_array_header_t *targets;   /* target list from file */ /* UTF-8! */
   svn_boolean_t xml;             /* output in xml, e.g., "svn log --xml" */
+  svn_boolean_t no_ignore;       /* do not ignore any files */
 
 } svn_cl__opt_state_t;
 
 
 /* All client command procedures conform to this prototype.  OPT_STATE
  * likewise should hold the result of processing the options.  OS is a
  * list of filenames and directories, a-la CVS (which really only
  * becomes useful if you pass it into svn_cl__args_to_target_array()
Index: ./subversion/clients/cmdline/status-cmd.c
===================================================================
--- ./subversion/clients/cmdline/status-cmd.c
+++ ./subversion/clients/cmdline/status-cmd.c	Fri Jul 26 15:09:49 2002
@@ -59,25 +59,26 @@
 
       /* Retrieve a hash of status structures with the information
          requested by the user.
 
          svn_client_status directly understands the three commandline
          switches (-n, -u, -[vV]) : */
 
       SVN_ERR (svn_client_status (&statushash, &youngest, target, auth_baton,
-                                  opt_state->nonrecursive ? 0 : 1,
+                                  opt_state->nonrecursive ? FALSE : TRUE,
                                   opt_state->verbose,
                                   opt_state->update,
+                                  opt_state->no_ignore,
                                   pool));
 
       /* Now print the structures to the screen.
          The flag we pass indicates whether to use the 'detailed'
          output format or not. */
-      svn_cl__print_status_list (statushash, 
+      svn_cl__print_status_list (statushash,
                                  youngest,
                                  (opt_state->verbose || opt_state->update),
                                  opt_state->verbose,
                                  opt_state->quiet,
                                  pool);
     }
 
   return SVN_NO_ERROR;
Index: ./subversion/clients/cmdline/main.c
===================================================================
--- ./subversion/clients/cmdline/main.c
+++ ./subversion/clients/cmdline/main.c	Fri Jul 26 15:37:48 2002
@@ -70,16 +70,18 @@
     {"show-updates",  'u', 0, "display update information"},
     {"username",      svn_cl__auth_username_opt, 1, "specify a username ARG"},
     {"password",      svn_cl__auth_password_opt, 1, "specify a password ARG"},
     {"extensions",    'x', 1, "pass \"ARG\" as bundled options to GNU diff"},
     {"targets",       svn_cl__targets_opt, 1,
                       "pass contents of file \"ARG\" as additional args"},
     {"xml",           svn_cl__xml_opt, 0, "output in xml"},
     {"strict",        svn_cl__strict_opt, 0, "use strict semantics"},
+    {"no-ignore",     svn_cl__no_ignore_opt, 0,
+                      "disregard default and svn:ignore property ignores"},
     {0,               0, 0}
   };
 
 
 /* The maximum number of options that can be accepted by a subcommand;
    this is simply the number of unique switches that exist in the
    table above.  */
 #define SVN_CL__MAX_OPTS sizeof(svn_cl__options)/sizeof(svn_cl__options[0])
@@ -371,17 +373,18 @@
     "     '+' history scheduled with commit\n"
     "\n"
     "Decoding --verbose output:\n"
     "Status| Out-of-date? | Local Rev | Last changed info |  Path\n"
     "    _                    965       938     kfogel      ./autogen.sh\n"
     "    _      *             965       970    sussman      ./build.conf\n"
     "    M                    965       687        joe      ./buildcheck.sh\n",
     { 'u', 'v', 'N', 'q',
-      svn_cl__auth_username_opt, svn_cl__auth_password_opt } },
+      svn_cl__auth_username_opt, svn_cl__auth_password_opt,
+      svn_cl__no_ignore_opt } },
   
   { "switch", svn_cl__switch, {"sw"},
     "Update working copy to mirror a new URL\n"
     "usage: switch REPOS_URL [TARGET]\n\n"
     "   Note:  this is the way to move a working copy to a new branch.\n",
     {'r', 'D', 'N', svn_cl__auth_username_opt, svn_cl__auth_password_opt} },
  
   { "update", svn_cl__update, {"up"}, 
@@ -1084,16 +1087,19 @@
         opt_state.filedata_encoding = apr_pstrdup (pool, opt_arg);
         break;
       case svn_cl__xml_opt:
         opt_state.xml = TRUE;
         break;
       case svn_cl__strict_opt:
         opt_state.strict = TRUE;
         break;
+      case svn_cl__no_ignore_opt:
+        opt_state.no_ignore = TRUE;
+        break;
       case 'x':
         err = svn_utf_cstring_to_utf8 (&opt_state.extensions, opt_arg,
                                        NULL, pool);
         if (err) {
           svn_handle_error (err, stderr, FALSE);
           svn_pool_destroy (pool);
           return EXIT_FAILURE;
         }
Index: ./doc/handbook/client.texi
===================================================================
--- ./doc/handbook/client.texi
+++ ./doc/handbook/.svn/tmp/client.texi.60812.00001.tmp	Fri Jul 26 16:02:34 2002
@@ -317,16 +317,24 @@
 item is part of a subtree scheduled for addition-with-history, i.e. some
 parent got copied, and it's just coming along for the ride.  @samp{M @ @
 +} means the item is part of a subtree scheduled for
 addition-with-history, @emph{and} it has local mods.  When you commit,
 first some parent will be added-with-history (copied), which means this
 file will automatically exist in the copy.  Then the local mods will be
 further uploaded into the copy.
 
+By default, @samp{svn status} ignores files matching the regular
+expressions @samp{*.o}, @samp{*.lo}, @samp{*.la}, @samp{#*#},
+@samp{*.rej}, @samp{*~}, and @samp{.#*}.  If you want additional files
+ignored, set the @samp{svn:ignore} property on the parent directory.  If
+you want to see the status of all the files in the repository
+irrespective of @samp{svn status} and @samp{svn:ignore}'s regular
+expressions, then use the @option{--no-ignore} command line option.
+
 If a single path is passed to the command, it will tell you about it:
 
 @example
 $ svn status stuff/fish.c
 D      stuff/fish.c
 @end example
 
 This command also has a @option{--verbose} (@option{-v}) mode, which will
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Jul 27 01:06:19 2002