| ... | ... | @@ -288,7 +288,7 @@ class CasBasedDirectory(Directory): | 
| 288 | 288 |                  return entry.descend(subdirectory_spec[1:], create)
 | 
| 289 | 289 |              else:
 | 
| 290 | 290 |                  # May be a symlink
 | 
| 291 |  | -                target = self._resolve(subdirectory_spec[0])
 | 
|  | 291 | +                target = self._resolve(subdirectory_spec[0], force_create=create)
 | 
| 292 | 292 |                  if isinstance(target, CasBasedDirectory):
 | 
| 293 | 293 |                      return target
 | 
| 294 | 294 |                  error = "Cannot descend into {}, which is a '{}' in the directory {}"
 | 
| ... | ... | @@ -381,7 +381,7 @@ class CasBasedDirectory(Directory): | 
| 381 | 381 |          return directory
 | 
| 382 | 382 |  
 | 
| 383 | 383 |      
 | 
| 384 |  | -    def _resolve(self, name, absolute_symlinks_resolve=True):
 | 
|  | 384 | +    def _resolve(self, name, absolute_symlinks_resolve=True, force_create=False):
 | 
| 385 | 385 |          """ Resolves any name to an object. If the name points to a symlink in
 | 
| 386 | 386 |          this directory, it returns the thing it points to,
 | 
| 387 | 387 |          recursively. Returns a CasBasedDirectory, FileNode or
 | 
| ... | ... | @@ -441,14 +441,21 @@ class CasBasedDirectory(Directory): | 
| 441 | 441 |                      else:
 | 
| 442 | 442 |                          # This is a file or None (i.e. broken symlink)
 | 
| 443 | 443 |                          print("  resolving {}: file/broken link".format(c))
 | 
| 444 |  | -                        if components:
 | 
|  | 444 | +                        if f is None and force_create:
 | 
|  | 445 | +                            print("Creating target of broken link {}".format(c))
 | 
|  | 446 | +                            return directory.descend(c, create=True)
 | 
|  | 447 | +                        elif components:
 | 
| 445 | 448 |                              # Oh dear. We have components left to resolve, but the one we're trying to resolve points to a file.
 | 
| 446 | 449 |                              raise VirtualDirectoryError("Reached a file called {} while trying to resolve a symlink; cannot proceed".format(c))
 | 
| 447 | 450 |                          else:
 | 
| 448 | 451 |                              return f
 | 
| 449 | 452 |                  else:
 | 
| 450 |  | -                    print("  resolving {}: Broken symlink".format(c))
 | 
| 451 |  | -                    return None
 | 
|  | 453 | +                    print("  resolving {}: Non-existent file; must be from a broken symlink.".format(c))
 | 
|  | 454 | +                    if force_create:
 | 
|  | 455 | +                        print("Creating target of broken link {} (2)".format(c))
 | 
|  | 456 | +                        return directory.descend(c, create=True)
 | 
|  | 457 | +                    else:
 | 
|  | 458 | +                        return None
 | 
| 452 | 459 |  
 | 
| 453 | 460 |          # Shouldn't get here.
 | 
| 454 | 461 |          
 |