Ticket #3666: PackageItem.diff

File PackageItem.diff, 1.3 KB (added by sil2100, 10 years ago)

Patch for fixing symlinks conflicts

  • PackageItem.cpp

     
    683683
    684684    BSymLink symlink;
    685685    ret = dir.CreateSymLink(destination.Path(), fLink.String(), &symlink);
     686    if (ret == B_FILE_EXISTS) {
     687        // We need to check if the existing symlink is pointing at the same path
     688        // as our new one - if not, let's prompt the user
     689        symlink.SetTo(destination.Path());
     690        BPath oldLink;
     691
     692        ret = symlink.MakeLinkedPath(&dir, &oldLink);
     693        chdir(dirPath.Path());
     694
     695        if (ret == B_BAD_VALUE || oldLink != fLink.String()) {
     696            // The old symlink is different (or not a symlink) - ask the user
     697            int32 selection = _ItemExists(destination.Leaf());
     698            switch (selection) {
     699                case 0:
     700                {
     701                    symlink.Unset();
     702                    BEntry entry;
     703                    ret = entry.SetTo(destination.Path());
     704                    if (ret != B_OK)
     705                        return ret;
     706
     707                    entry.Remove();
     708                    ret = dir.CreateSymLink(destination.Path(), fLink.String(), &symlink);
     709
     710                    break;
     711                }
     712                case 1:
     713                    parser_debug("Skipping already existent SymLink\n");
     714                    return B_OK;
     715                default:
     716                    ret = B_FILE_EXISTS;
     717            }
     718        } else {
     719            ret = B_OK;
     720        }
     721    }
    686722    if (ret != B_OK) {
    687723        parser_debug("CreateSymLink failed\n");
    688724        return ret;