Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Could not extract files with non-latin names from rar archive #769

Closed
unxed opened this issue Oct 6, 2020 · 9 comments
Closed

Could not extract files with non-latin names from rar archive #769

unxed opened this issue Oct 6, 2020 · 9 comments

Comments

@unxed
Copy link
Contributor

unxed commented Oct 6, 2020

  1. Seems far2l uses libarchive for rar now
  2. Seems libarchive has problems with non-latin file names in rar
  3. Seems it can not be switched to command line rar, "command lines" setting is ignored

Sample (.rar is inside .zip):
1234.zip

@elfmz
Copy link
Owner

elfmz commented Oct 6, 2020

check now.
Also ' "command lines" setting is ignored' should not be

@unxed
Copy link
Contributor Author

unxed commented Oct 6, 2020

check now.

Unpacking this sample rar works fine, thanks!

Also ' "command lines" setting is ignored' should not be

Still ignored :( "rar" is set in settings, but libarchive is called instead

@unxed
Copy link
Contributor Author

unxed commented Oct 6, 2020

Now .tar.gz with cyrillic filenames can not be unpacked

1234.tar.gz

elfmz added a commit that referenced this issue Oct 6, 2020
@elfmz
Copy link
Owner

elfmz commented Oct 6, 2020

А ща?
Блин мне ета либархив нравится все меньше. Красивый АПИ, а внутри глючный и поддерживающий мало-форматов (типа 7z)

@unxed
Copy link
Contributor Author

unxed commented Oct 6, 2020

А ща?

Ща огонь!

  1. .rar с кириллицей распаковывается нормально
  2. .tar.gz с кириллицей распаковывается нормально
  3. даже .zip с кириллицей стало возможным распоковать libarch'ом, если делать так:
/usr/lib/far2l/far2l --libexec "/usr/lib/far2l/Plugins/multiarc/plug/multiarc.far-plug-mb" BuiltinMain libarch x n.zip "`echo Новый текстовый документ.txt | iconv -f utf-8 -t cp866`"
mv "`echo Новый текстовый документ.txt | iconv -f utf-8 -t cp866`" "Новый текстовый документ.txt"

— этот момент, впрочем, я пока только на одном архиве проверил

Один бажок только остался: в настройках .rar всё ещё стоит

^rar x {-p%%P} {-ap%%R} -y -c- -kb -- %%A @%%LNM
^rar e {-p%%P} -y -c- -kb -- %%A @%%LNM
^rar t -y {-p%%P} -- %%A

ну и т.д., а обрабатываются рары всё равно libarch'ом

Блин мне ета либархив нравится все меньше. Красивый АПИ, а внутри глючный и поддерживающий мало-форматов (типа 7z)

Серебряной пули нет (c) :))

@unxed
Copy link
Contributor Author

unxed commented Oct 6, 2020

даже .zip с кириллицей стало возможным распоковать libarch'ом, если делать так:

Увы, это прокатывает только с .zip'ами, которые содержат имя файлов ТОЛЬКО в OEM. Из зипов, в которых есть utf-8 версия имени файлов, всё ещё не получается ничего вытащить с помощью libarchive — что с транскодированием имен файлов в командной строке, что без.

Попытался сделать вокруг вызовов libarch примерно такую же обёртку, как вокруг зипов. Оно даже немножко работает (ну, на тех файлах, которые libarch соглашается распаковать). Тут, понятно, пока всё сыро, я серьезно не занимался этим, просто развлекался.

#!/usr/bin/perl

$prefix = '/usr/lib/far2l/far2l --libexec "/usr/lib/far2l/Plugins/multiarc/plug/multiarc.far-plug-mb" BuiltinMain libarch ';

# Usage: ^arch <command> <archive_name> [-@OPTIONAL ARCHIVE ROOT] [OPTIONAL LIST OF FILES]

use Text::Iconv;
$to_oem = Text::Iconv->new("utf-8", "cp866");

if ($ARGV[0] eq 'x') {
    $action = shift @ARGV;
    $arch_name = shift @ARGV;
    foreach (@ARGV) {
        push(@arg, '"' . $_ . '"');
    }
    $tail_oem = $to_oem->convert(join ' ', @arg);
    $cmd = $prefix . $action . ' "' . $arch_name . '" ' . $tail_oem;
    print "\n" . $cmd . "\n";
    #exit;
    $ret = qx($cmd);
    $exit_code = $?; # todo: handle errors
    foreach (@arg) {
        $fn_oem = $_;
        chop($fn_oem); $fn_oem = reverse($fn_oem); chop($fn_oem); $fn_oem = reverse($fn_oem); # remove quotes
        $filename_utf8 = $to_oem->convert($fn_oem);
        $rename_error = rename $filename_utf8, $fn_oem; # todo: handle errors
    }
    print $ret;

    # retry as utf-8
    $tail = join ' ', @arg;
    print $tail;
    $cmd = $prefix . $action . ' "' . $arch_name . '" ' . $tail;
    print "\n" . $cmd . "\n";
    #exit;
    $ret = qx($cmd);
    $exit_code = $?; # todo: handle errors
    print $ret;
        
    exit;

} elsif ($ARGV[0] eq 'a') {

    # THIS SEGFAULTS

    foreach (@ARGV) {
        if (index($_, "-@") == 0) {
            push(@arg, '"' . $to_oem->convert($_) . '"');
        } else {
            push(@arg, '"' . $_ . '"');
        }
    }
    $tail = join ' ', @arg;
    $cmd = $prefix . $tail;
    #print "\n" . $cmd . "\n";
    #exit;
    $ret = qx($cmd);
    $exit_code = $?;
    print $ret;
    exit $exit_code / 256;

} else {

    print "WIP\n";
}

@unxed
Copy link
Contributor Author

unxed commented Oct 6, 2020

Удаление из rar'ов с кириллицей сломано ещё, оказывается(

$ "/usr/lib/far2l/far2l" --libexec "/usr/lib/far2l/Plugins/multiarc/plug/multiarc.far-plug-mb" BuiltinMain libarch d /home/u
nxed/far2l/test/1234.rar "тестовый файл 1.тест"
Exception: Error -30 writing header: тестовая папка 1/тестовый файл 2.тест

@unxed
Copy link
Contributor Author

unxed commented Oct 7, 2020

As extraction from .rars is fixed now, let's close this issue and write dedicated ones for remaining related problems:
#773
#774

@unxed
Copy link
Contributor Author

unxed commented Oct 7, 2020

Блин мне ета либархив нравится все меньше. Красивый АПИ, а внутри глючный и поддерживающий мало-форматов (типа 7z)

Слабое утешение, но в мире linux везде всё плохо с кириллическими именами файлов в зипах (и иногда рарах), это не только у нас проблемы такие. Вот, например
mate-desktop/engrampa#5
mate-desktop/engrampa#411

Хорошая новость: у нас есть шанс сделать первый менеджер архивов для linux, лишенный этого недостатка. И захватить мир :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants