[prev in list] [next in list] [prev in thread] [next in thread] 

List:       subversion-cvs
Subject:    svn commit: rev 567 - trunk/subversion/include trunk/subversion/libsvn_wc trunk/subversion/clients/c
From:       sussman () tigris ! org
Date:       2001-11-29 19:43:06
[Download RAW message or body]

Author: sussman
Date: 2001-11-29 19:43 GMT
New Revision: 567

Modified:
   trunk/subversion/clients/cmdline/status.c
   trunk/subversion/include/svn_wc.h
   trunk/subversion/libsvn_wc/status.c
   trunk/subversion/libsvn_wc/status_editor.c
   trunk/subversion/tests/clients/cmdline/commit_tests.py
   trunk/subversion/tests/clients/cmdline/copy_tests.py
   trunk/subversion/tests/clients/cmdline/log_tests.py
   trunk/subversion/tests/clients/cmdline/schedule_tests.py
   trunk/subversion/tests/clients/cmdline/svntest/actions.py
   trunk/subversion/tests/clients/cmdline/svntest/tree.py
   trunk/subversion/tests/clients/cmdline/update_tests.py
Log:

Show 'copied' entry flag in its own column in 'svn status' output.
This reflects the fact that 'copied' is truly independent of any
scheduled operation, and also allows the eye to see copied subtrees as
a visual block.

* svn_wc.h (svn_wc_status_t):  add 'copied' field to structure.

* libsvn_wc/status.c (assemble_status): don't convert a 'copied' flag
  into an 'add' schedule; instead, just set the new structure field.

* cmdline/status.c (generate_status_codes): add copied argument.
  (print_short_format): update call to generate_status_codes.
  (print_long_format): same.

* status_editor.c (tweak_statushash): BUGFIX!!! Gah, alloc a
  structure, not a structure-address!  I can't believe this hasn't
  bitten us before!  (Has gstein taught us -nothing- about how to use
  apr_pcalloc?)

* tree.py (build_tree_from_status):  new regexp to parse 'copied'
  status field.  Also, do not put 'copied' or 'locked' attribute into
  node's hash unless something actually appears in the columns.  This
  will simplify our tests quite a bit.

* actions.py (get_virginal_status_list): stop putting an empty
  'locked' attribute into list items.

* commit_tests.py (get_standard_status_list): same.
  (nested_dir_replacements): same.
  (merge_mixed_revisions): same.
  (commit_uri_unsafe): same.

* update_tests.py (update_binary_file): same.
  (update_binary_file_2): same.
  (update_ignores_added): same.

* log_tests.py (guarantee_repos_and_wc): same.
 
* schedule_tests.py (add_files_core): same.
  (add_directories_core): same.
  (nested_adds_core): same.

* copy_tests.py (basic_copy_and_move_files): same.... plus...



Modified: trunk/subversion/include/svn_wc.h
==============================================================================
--- OLD/trunk/subversion/include/svn_wc.h	Thu Nov 29 13:43:05 2001
+++ NEW/trunk/subversion/include/svn_wc.h	Thu Nov 29 13:43:05 2001
@@ -272,7 +272,13 @@
      component.  */
   enum svn_wc_status_kind text_status;
   enum svn_wc_status_kind prop_status;
+
+  /* Booleans: a directory can be 'locked' if a working copy update
+     was interrupted, and a file or directory can be 'copied' if it's
+     scheduled for addition-with-history (or part of a subtree that
+     is scheduled as such.) */
   svn_boolean_t locked;
+  svn_boolean_t copied;
 
   /* Fields that describe the status of the entry in the repository;
      in other words, these fields indicate whether text or props would

Modified: trunk/subversion/libsvn_wc/status.c
==============================================================================
--- OLD/trunk/subversion/libsvn_wc/status.c	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/libsvn_wc/status.c	Thu Nov 29 13:43:06 2001
@@ -123,8 +123,7 @@
         these states are of medium precedence.  They also override any
         C or M that may be in the prop_status field at this point.*/
 
-  if ((entry->schedule == svn_wc_schedule_add)
-      || (entry->copied))
+  if (entry->schedule == svn_wc_schedule_add)
     {
       final_text_status = svn_wc_status_added;
       final_prop_status = svn_wc_status_none;
@@ -179,13 +178,14 @@
   stat->repos_text_status = svn_wc_status_none;   /* default */
   stat->repos_prop_status = svn_wc_status_none;   /* default */
   stat->locked = FALSE;
-
+  stat->copied = FALSE;
   
-  /* 6. Check for locked directory. */
+  /* 6. Check for locked directory, or if the item is 'copied'. */
 
   if (entry->kind == svn_node_dir)
     SVN_ERR (svn_wc__locked (&(stat->locked), path, pool));
-  
+  if (entry->copied)
+    stat->copied = TRUE;
 
   *status = stat;
 

Modified: trunk/subversion/libsvn_wc/status_editor.c
==============================================================================
--- OLD/trunk/subversion/libsvn_wc/status_editor.c	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/libsvn_wc/status_editor.c	Thu Nov 29 13:43:06 2001
@@ -123,7 +123,7 @@
       if (repos_text_status == svn_wc_status_added)
         {
           /* Make a status struct */
-          statstruct = apr_pcalloc (pool, sizeof(svn_wc_status_t *));
+          statstruct = apr_pcalloc (pool, sizeof(*statstruct));
           
           /* Make an entry struct inside it */
           statstruct->entry = apr_pcalloc (pool, sizeof(svn_wc_entry_t *));

Modified: trunk/subversion/clients/cmdline/status.c
==============================================================================
--- OLD/trunk/subversion/clients/cmdline/status.c	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/clients/cmdline/status.c	Thu Nov 29 13:43:06 2001
@@ -30,8 +30,8 @@
 
 
 
-/* Fill in the first three characters of STR_STATUS with status code
-   characters, based on TEXT_STATUS, PROP_STATUS, and LOCKED.
+/* Fill in the first four characters of STR_STATUS with status code
+   characters, based on TEXT_STATUS, PROP_STATUS, LOCKED, and COPIED.
    PROP_TIME is used to determine if properties exist in the first
    place (when prop_status is 'none').  */
 static void
@@ -39,7 +39,8 @@
                        enum svn_wc_status_kind text_status,
                        enum svn_wc_status_kind prop_status,
                        apr_time_t prop_time,
-                       svn_boolean_t locked)
+                       svn_boolean_t locked,
+                       svn_boolean_t copied)
 {
   char text_statuschar, prop_statuschar;
 
@@ -112,10 +113,11 @@
       break;
     }
 
-  sprintf (str_status, "%c%c%c", 
+  sprintf (str_status, "%c%c%c%c", 
            text_statuschar, 
            prop_statuschar,
-           locked ? 'L' : ' ');
+           locked ? 'L' : ' ',
+           copied ? '@' : ' ');
 }
 
 
@@ -124,7 +126,7 @@
 print_short_format (const char *path,
                     svn_wc_status_t *status)
 {
-  char str_status[4];
+  char str_status[5];
 
   if (! status)
     return;
@@ -134,7 +136,8 @@
                          status->text_status,
                          status->prop_status,
                          status->entry->prop_time,
-                         status->locked);
+                         status->locked,
+                         status->copied);
 
   printf ("%s   %s\n", str_status, path);
 }
@@ -145,7 +148,7 @@
 print_long_format (const char *path,
                    svn_wc_status_t *status)
 {
-  char str_status[4];
+  char str_status[5];
   char update_char;
   svn_revnum_t local_rev;
 
@@ -157,7 +160,8 @@
                          status->text_status,
                          status->prop_status,
                          status->entry->prop_time,
-                         status->locked);
+                         status->locked,
+                         status->copied);
 
   /* Create update indicator. */
   if ((status->repos_text_status != svn_wc_status_none)
@@ -187,9 +191,9 @@
 
   /* Otherwise, go ahead and show the local revision number. */
   else if (local_rev == SVN_INVALID_REVNUM)
-    printf ("%s    %c      ?       %s\n", str_status, update_char, path);
+    printf ("%s   %c      ?       %s\n", str_status, update_char, path);
   else
-    printf ("%s    %c    %6ld    %s\n", str_status, update_char,
+    printf ("%s   %c    %6ld    %s\n", str_status, update_char,
             local_rev, path);
 }
 

Modified: trunk/subversion/tests/clients/cmdline/commit_tests.py
==============================================================================
--- OLD/trunk/subversion/tests/clients/cmdline/commit_tests.py	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/tests/clients/cmdline/commit_tests.py	Thu Nov 29 13:43:06 2001
@@ -73,22 +73,18 @@
   # New things
   status_list.append([os.path.join(wc_dir, 'Q'), None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([os.path.join(wc_dir, 'Q', 'floo'), None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([os.path.join(wc_dir, 'A', 'D', 'H', 'gloo'), None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([os.path.join(wc_dir, 'A', 'B', 'E', 'bloo'), None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
 
@@ -544,7 +540,6 @@
   sl[path_index(sl, os.path.join(wc_dir, 'A', 'D', 'H'))][3]['wc_rev'] = "0"  
   sl.append([os.path.join(wc_dir, 'A', 'D', 'bloo'), None, {},
              {'status' : 'A ',
-              'locked' : ' ',
               'wc_rev' : '0',
               'repos_rev' : '1'}])
 
@@ -580,7 +575,6 @@
   sl[path_index(sl, os.path.join(wc_dir, 'A', 'D', 'H'))][3]['wc_rev'] = "2"  
   sl.append([os.path.join(wc_dir, 'A', 'D', 'bloo'), None, {},
              {'status' : '_ ',
-              'locked' : ' ',
               'wc_rev' : '2',
               'repos_rev' : '2'}])
 
@@ -963,16 +957,16 @@
   # 2. svn up A/D/H
   status_list = []
   status_list.append([H_path, None, {},
-                      {'status' : '_ ', 'locked' : ' ',
+                      {'status' : '_ ',
                        'wc_rev' : '2', 'repos_rev' : '2'}])
   status_list.append([chi_path, None, {},
-                      {'status' : '_ ', 'locked' : ' ',
+                      {'status' : '_ ', 
                        'wc_rev' : '2', 'repos_rev' : '2'}])
   status_list.append([omega_path, None, {},
-                      {'status' : '_ ', 'locked' : ' ',
+                      {'status' : '_ ', 
                        'wc_rev' : '2', 'repos_rev' : '2'}])
   status_list.append([psi_path, None, {},
-                      {'status' : '_ ', 'locked' : ' ',
+                      {'status' : '_ ', 
                        'wc_rev' : '2', 'repos_rev' : '2'}])
   expected_status_tree = svntest.tree.build_generic_tree(status_list)
   my_greek_tree = [['omega', "This is the file 'omega'.", {}, {}],
@@ -1159,7 +1153,7 @@
   # Items in our add list will be at rev 2
   for item in add_list:
     item_list = [item, None, {}, {'wc_rev': '2', 'repos_rev': '2',
-                                  'locked': ' ', 'status': '_ '}]
+                                  'status': '_ '}]
     status_list.append(item_list)
 
   expected_status_tree = svntest.tree.build_generic_tree(status_list)

Modified: trunk/subversion/tests/clients/cmdline/copy_tests.py
==============================================================================
--- OLD/trunk/subversion/tests/clients/cmdline/copy_tests.py	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/tests/clients/cmdline/copy_tests.py	Thu Nov 29 13:43:06 2001
@@ -176,22 +176,18 @@
   # New items in the status tree:
   status_list.append([rho_copy_path, None, {},
                       {'status' : '_ ',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '2'}])
   status_list.append([alpha2_path, None, {},
                       {'status' : '_ ',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '2'}])
   status_list.append([new_mu_path, None, {},
                       {'status' : '_ ',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '2'}])
   status_list.append([new_iota_path, None, {},
                       {'status' : '_ ',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '2'}])
   # Items that are gone:

Modified: trunk/subversion/tests/clients/cmdline/schedule_tests.py
==============================================================================
--- OLD/trunk/subversion/tests/clients/cmdline/schedule_tests.py	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/tests/clients/cmdline/schedule_tests.py	Thu Nov 29 13:43:06 2001
@@ -73,17 +73,14 @@
   status_list = svntest.actions.get_virginal_status_list(wc_dir, '1')
   status_list.append([delta_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([zeta_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([epsilon_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   expected_output_tree = svntest.tree.build_generic_tree(status_list)
@@ -113,17 +110,14 @@
   status_list = svntest.actions.get_virginal_status_list(wc_dir, '1')
   status_list.append([X_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([Y_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([Z_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   expected_output_tree = svntest.tree.build_generic_tree(status_list)
@@ -174,52 +168,42 @@
   status_list = svntest.actions.get_virginal_status_list(wc_dir, '1')
   status_list.append([X_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([Y_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([Z_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([P_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([Q_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([R_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([delta_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([epsilon_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([upsilon_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   status_list.append([zeta_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   expected_output_tree = svntest.tree.build_generic_tree(status_list)

Modified: trunk/subversion/tests/clients/cmdline/svntest/tree.py
==============================================================================
--- OLD/trunk/subversion/tests/clients/cmdline/svntest/tree.py	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/tests/clients/cmdline/svntest/tree.py	Thu Nov 29 13:43:06 2001
@@ -561,6 +561,8 @@
 #   Tree nodes will contain no contents, and these atts:
 #
 #          'status', 'wc_rev', 'repos_rev'
+#             ... and possibly 'locked', 'copied', IFF columns non-empty.
+# 
 
 def build_tree_from_status(lines):
   "Return a tree derived by parsing the output LINES from 'st'."
@@ -574,16 +576,20 @@
   else:
     repos_rev = '?'
     
-  rm = re.compile ('^(..)(.)([^0-9]+)(\d+|-)\s+(.+)')
+  rm = re.compile ('^(..)(.)(.)([^0-9]+)(\d+|-)\s+(.+)')
   for line in lines:
     match = rm.search(line)
     if match and match.groups():
-      if match.group(4) != '-': # ignore items that only exist on repos
-        new_branch = create_from_path(match.group(5), None, {},
-                                      {'status' : match.group(1),
-                                       'locked' : match.group(2),
-                                       'wc_rev' : match.group(4),
-                                       'repos_rev' : repos_rev})
+      if match.group(5) != '-': # ignore items that only exist on repos
+        atthash = {'status' : match.group(1),
+                   'wc_rev' : match.group(5),
+                   'repos_rev' : repos_rev}
+        if match.group(2) != ' ':
+          atthash['locked'] = match.group(2)
+        if match.group(3) != ' ':
+          atthash['copied'] = match.group(3)
+        new_branch = create_from_path(match.group(6), None, {}, atthash)
+
       root.add_child(new_branch)
 
   return root

Modified: trunk/subversion/tests/clients/cmdline/svntest/actions.py
==============================================================================
--- OLD/trunk/subversion/tests/clients/cmdline/svntest/actions.py	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/tests/clients/cmdline/svntest/actions.py	Thu Nov 29 13:43:06 2001
@@ -337,15 +337,12 @@
 # Returns a list of the form:
 #
 #   [ ['wc_dir', None, {}, {'status':'_ ',
-#                           'locked':' ',
 #                           'wc_rev':'1',
 #                           'repos_rev':'1'}],
 #     ['wc_dir/A', None, {}, {'status':'_ ',
-#                             'locked':' ',
 #                             'wc_rev':'1',
 #                             'repos_rev':'1'}],
 #     ['wc_dir/A/mu', None, {}, {'status':'_ ',
-#                                'locked':' ',
 #                                'wc_rev':'1',
 #                                'repos_rev':'1'}],
 #     ... ]
@@ -362,14 +359,12 @@
 
   output_list = [[wc_dir, None, {},
                   {'status' : '_ ',
-                   'locked' : ' ',
                    'wc_rev' : rev,
                    'repos_rev' : rev}]]
   path_list = [x[0] for x in main.greek_tree]
   for path in path_list:
     item = [os.path.join(wc_dir, path), None, {},
             {'status' : '_ ',
-             'locked' : ' ',
              'wc_rev' : rev,
              'repos_rev' : rev}]
     output_list.append(item)

Modified: trunk/subversion/tests/clients/cmdline/log_tests.py
==============================================================================
--- OLD/trunk/subversion/tests/clients/cmdline/log_tests.py	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/tests/clients/cmdline/log_tests.py	Thu Nov 29 13:43:06 2001
@@ -178,7 +178,6 @@
   status_list.pop(path_index(status_list, os.path.join(wc_path, alpha_path)))
   status_list.append([os.path.join(wc_path, epsilon_path), None, {},
                       {'status' : '_ ',
-                       'locked' : ' ',
                        'wc_rev' : '9',
                        'repos_rev' : '9'}])
 

Modified: trunk/subversion/tests/clients/cmdline/update_tests.py
==============================================================================
--- OLD/trunk/subversion/tests/clients/cmdline/update_tests.py	Thu Nov 29 13:43:06 2001
+++ NEW/trunk/subversion/tests/clients/cmdline/update_tests.py	Thu Nov 29 13:43:06 2001
@@ -108,7 +108,6 @@
     item[3]['wc_rev'] = '1'
   status_list.append([theta_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '2'}])
   expected_status_tree = svntest.tree.build_generic_tree(status_list)
@@ -138,7 +137,6 @@
     item[3]['wc_rev'] = '1'
   status_list.append([theta_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '3',
                        'repos_rev' : '3'}])
   expected_status_tree = svntest.tree.build_generic_tree(status_list)
@@ -171,7 +169,6 @@
   status_list = svntest.actions.get_virginal_status_list(wc_backup, '3')
   status_list.append([theta_backup_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '3',
                        'repos_rev' : '3'}])  
   expected_status_tree = svntest.tree.build_generic_tree(status_list)
@@ -253,12 +250,10 @@
     item[3]['wc_rev'] = '1'
   status_list.append([theta_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '2'}])
   status_list.append([zeta_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '2'}])
   expected_status_tree = svntest.tree.build_generic_tree(status_list)
@@ -286,12 +281,10 @@
     item[3]['wc_rev'] = '1'
   status_list.append([theta_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '3',
                        'repos_rev' : '3'}])
   status_list.append([zeta_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '3',
                        'repos_rev' : '3'}])
   expected_status_tree = svntest.tree.build_generic_tree(status_list)
@@ -324,12 +317,10 @@
     item[3]['wc_rev'] = '2'
   status_list.append([theta_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '3'}])  
   status_list.append([zeta_path, None, {},
                       {'status' : '__',
-                       'locked' : ' ',
                        'wc_rev' : '2',
                        'repos_rev' : '3'}])  
   expected_status_tree = svntest.tree.build_generic_tree(status_list)
@@ -427,7 +418,6 @@
   status_list = svntest.actions.get_virginal_status_list(wc_dir, '1')
   status_list.append([zeta_path, None, {},
                       {'status' : 'A ',
-                       'locked' : ' ',
                        'wc_rev' : '0',
                        'repos_rev' : '1'}])
   expected_status_tree = svntest.tree.build_generic_tree(status_list)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic