[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

RE: [PATCH] Add svn_wc_status_obstructed

From: Sander Striker <striker_at_apache.org>
Date: 2002-08-07 20:00:38 CEST

> From: Sander Striker [mailto:striker@apache.org]
> Sent: 06 August 2002 19:04

>> My other thought is regarding your question about the STRICT flag to
>> svn_wc_statuses(). The doc string says:
>> If STRICT is non-zero, then if we encounter a path that is not in
>> the wc, we'll return an error. STRICT should be zero if we're
>> updating, as the update will catch any non wc path errors (and
>> properly deal with files that are in the repository but missing
>> from the wc for whatever reason).
>> At first I thought "not in the wc" meant the same as "unversioned",
>> but the following code in assemble_status() shows what's really going
>> on. This is the only place where `strict' is actually used, instead
>> of just passed along:
>> /* If we're in strict mode and we encounter a path that doesn't
>> exist in the wc, then we return an error*/
>> if (strict && (path_kind == svn_node_none))
>> return svn_error_createf (APR_ENOENT, 0, NULL, pool,
>> "assemble_status: "
>> "%s: No such file or directory",
>> path);
>> So STRICT is about returning an error instead of storing code
>> svn_wc_status_absent. Thus, strictly speaking, you don't have to pay
>> attention to STRICT. But in real life, I think it would be best to
>> see who is passing the STRICT flag to svn_wc_statuses(), and why, and
>> consider whether those cases will be affected by this new
>> svn_wc_status_obstructed code. And if you want to clarify the
>> description of STRICT semantics in the doc string for
>> svn_wc_statuses(), that'd be great :-).
> Hrmm... Ok, I'll see if I can identify the callers that use STRICT...

Did that:

subversion/libsvn_client/delete.c (svn_client__can_delete):
  SVN_ERR (svn_wc_statuses (hash, path, TRUE, FALSE, TRUE, FALSE, pool));

subversion/libsvn_client/status.c (svn_client_status):
  /* 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
     doesn't exist in the wc, we should throw an error */
  if (update)
    strict = FALSE;
    strict = TRUE;

Now, on the working of STRICT... currently it doesn't do anything (I think).
The check is:

  if (! entry)

      /* If we're in strict mode and we encounter a path that doesn't
         exist in the wc, then we return an error*/
      if (strict && (path_kind == svn_node_none))
        return svn_error_createf (APR_ENOENT, 0, NULL, pool,
                                  "assemble_status: "
                                  "%s: No such file or directory",

IOW, there is no entry and the path doesn't exist in the filesystem. This
can never happen (or can it??). Can someone please explain what it is
supposed to do?

Personally I feel that we should implement STRICT to return an error
whenever a resource is either obstructed or absent. Returning error
on absense is disputable, since there is checking in place for
svn_wc_status_absent in at least one of the callers of svn_wc_statuses
(svn_client__can_delete). Maybe that caller shouldn't use STRICT
and just grow knowledge of svn_wc_status_obstructed?

Anyhow, the patch attached does add svn_status_obstructed and handles
STRICT as I describe above, but... I get a bunch o' failing tests :(

At least one test FAILED, checking /opt/src/build/subversion/tests.log
FAIL: basic_tests.py 1: basic checkout of a wc
FAIL: basic_tests.py 8: basic cleanup command
FAIL: basic_tests.py 11: basic delete command
FAIL: basic_tests.py 13: attempt to change node kind
FAIL: commit_tests.py 1: commit one file.
FAIL: commit_tests.py 2: commit one newly added file.
FAIL: commit_tests.py 3: commit multiple targets
FAIL: commit_tests.py 4: commit multiple targets, 2nd variation
FAIL: commit_tests.py 5: commit wc_dir/A/D -- includes D. (anchor=A, tgt=D)
FAIL: commit_tests.py 6: commit wc_dir -- (anchor=wc_dir, tgt={})
FAIL: commit_tests.py 8: replace two nested dirs, verify empty contents
FAIL: commit_tests.py 21: commit the current directory
FAIL: prop_tests.py 1: write/read props in wc only (ps, pl, pdel)
FAIL: prop_tests.py 2: commit properties
FAIL: prop_tests.py 3: receive properties via update
FAIL: prop_tests.py 6: update with conflicting props
FAIL: schedule_tests.py 2: schedule: add some directories
FAIL: schedule_tests.py 3: schedule: add some nested files and directories
FAIL: schedule_tests.py 5: schedule: delete some directories
FAIL: schedule_tests.py 7: revert: add some directories
FAIL: schedule_tests.py 8: revert: add some nested files and directories
FAIL: schedule_tests.py 10: revert: delete some directories
FAIL: log_tests.py 1: 'svn log', no args, top of wc.

If anyone can please take a look at this ;)



To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org

Received on Wed Aug 7 19:51:11 2002

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.