按日期排序 svnadmin lslocks -- 获取最新的锁

sort svnadmin lslocks by date -- get the latest lock

我正在编写一个钩子脚本,一旦有人锁定文件,它就会向所有人发送电子邮件。

因此,我需要锁定文件的用户、文件的路径以及文件被锁定的日期和时间。

有什么方法可以按创建日期对 svnadmin lslocks 的输出进行排序吗?似乎 svnadmin lslocks 随机排序给定存储库中的所有锁。

[编辑] svnadmin lslocks /path/to/repository/:

的一些示例输出
Pfad: /path/to/test/myfile.txt
UUID-Marke: opaquelocktoken:847dfw969-43a15-422fe-9caa5-d
Eigentümer: user3
Erstellt: 2017-07-12 11:18:52 +0200 (Mi, 12. Jul 2017)
Läuft ab: 
Kommentar (0 Zeilen):


Pfad: /myfile.txt
UUID-Marke: opaquelocktoken:9397da59c-es1d9-45d1f-92eb-2b627ca6471079
Eigentümer: user3
Erstellt: 2017-07-12 11:12:51 +0200 (Mi, 12. Jul 2017)
Läuft ab: 
Kommentar (0 Zeilen):


Pfad: /path/to/text.cpp
UUID-Marke: opaquelocktoken:bfb9bs5246-4a783-42321-83f9-1723c4871cee22
Eigentümer: user2
Erstellt: 2017-07-12 11:13:31 +0200 (Mi, 12. Jul 2017)
Läuft ab: 
Kommentar (0 Zeilen):


Pfad: /path/to/my.java
UUID-Marke: opaselocksken:2b13s07-f06b-4s043b-aae12-6db205ee379f99
Eigentümer: user1
Erstellt: 2017-07-12 13:26:26 +0200 (Mi, 12. Jul 2017)
Läuft ab: 
Kommentar (1 Zeile):
Ich locke jetzt!

当我再次执行 svnadmin lslocks /path/to/repository/ 时,输出如下所示:

Pfad: /path/to/text.cpp
UUID-Marke: opaquelocktoken:bfb9bs5246-4a783-42321-83f9-1723c4871cee22
Eigentümer: user2
Erstellt: 2017-07-12 11:13:31 +0200 (Mi, 12. Jul 2017)
Läuft ab: 
Kommentar (0 Zeilen):


Pfad: /path/to/my.java
UUID-Marke: opaselocksken:2b13s07-f06b-4s043b-aae12-6db205ee379f99
Eigentümer: user1
Erstellt: 2017-07-12 13:26:26 +0200 (Mi, 12. Jul 2017)
Läuft ab: 
Kommentar (1 Zeile):
Ich locke jetzt!

Pfad: /path/to/test/myfile.txt
UUID-Marke: opaquelocktoken:847dfw969-43a15-422fe-9caa5-d
Eigentümer: user3
Erstellt: 2017-07-12 11:18:52 +0200 (Mi, 12. Jul 2017)
Läuft ab: 
Kommentar (0 Zeilen):


Pfad: /myfile.txt
UUID-Marke: opaquelocktoken:9397da59c-es1d9-45d1f-92eb-2b627ca6471079
Eigentümer: user3
Erstellt: 2017-07-12 11:12:51 +0200 (Mi, 12. Jul 2017)
Läuft ab: 
Kommentar (0 Zeilen):

那些至少六行的块是随机排序的。但我需要最近的区块。块可以有注释,注释可以有n行。每块之后,有一个空行。

将 $/ 设置为空字符串会在段落模式下转换 perl

perl -ne '
    BEGIN {$/=""}
    push @A, $_;
    END {
        print for sort{
            $a=~/^CREATED.*$/m;
            my $a1=$&;
            $b=~/^CREATED.*$/m;
            my $b1=$&;
            $a1 cmp $b1
        } @A
    }'

要在排序块中反转顺序:$b1 cmp $a1

编辑:由于问题已更新

svnadmin lslocks /path/to/repository/ | perl -ne '
    BEGIN {
        # set input record separator to turn on "paragraph" mode
        # records are delimited by more than 2 newlines (\n\n+)
        $/ = "";
    }
    # append record to array @A
    push @A, $_;
    END {
        # print records sorted by matched regex
        print for sort {
            $a =~ /^Erstellt:\K.*$/m;
            my $a1=$&;
            $b =~ /^Erstellt:\K.*$/m;
            my $b1=$&;
            $a1 cmp $b1
        } @A
    }'

将 bash 的输出存储到变量中,例如

    content=$( svnadmin ... | perl ... )
    echo "$content"

否则为了避免使用 perl,只能使用 GNU sed 和 sort,(如果日期总是第四行 sort -k 4

svnadmin ... |
    sed -rz 's/\n\n+/\x1/g;s/\n/\x2/g;s/\x1/\n/g' |
    LC_ALL=C sort -t $'\x2' -k 4 |
    sed -rz 's/\n/\n\n/g;s/\x2/\n/g'

编辑:只记住最高日期

perl -ne '
    BEGIN {
        $/ = "";
    }
    /^Erstellt:\K.*$/m or next;
    my $record_date = $&;
    $record_date gt $highest or next;
    $highest = $record_date;
    $record = $_;
    END {
        print $record
    }'

试试这个 awk 解决方案:

svnadmin lslocks | awk '{ if (  == "Pfad:" ) { cnt++ } arry[cnt]=arry[cnt][=10=]"\n";if (  == "Erstellt:" ) { arry1[cnt]=mktime(gensub("[-:]"," ","g"," "))"-"cnt } } END { asort(arry1);split(arry1[cnt],arry2,"-");indx=arry2[2];printf "%s",arry[indx] }'

获取 "svnadmin lslocks" 的输出并构建每个块的数组 (arry),每次遇到带有 "Pfad" 的行时,计数器 (cnt) 都会递增。同时,我们创建另一个数组 (arry1),其中包含提取的日期以及用“-”分隔的计数。在正确显示日期和时间(删除 : 和 - )之后,日期使用函数 mktime 获取纪元的秒数​​。最后,我们按日期对 arry1 进行排序,最后一个元素将保存我们可以用来打印的 cnt arry 的最后一个区块。

svnadmin lslocks is not the tool to be used in the post-lock hook script. What you actually look for is svnlook lock。使用svnlook lock时,不需要处理锁信息,不需要排序