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

时间:2017-07-12 12:05:44

标签: bash sorting svn hook

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

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

有没有办法按照创建的日期对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行长。每个块后,都有一个空行。

3 个答案:

答案 0 :(得分:2)

在段落模式下将$ /设置为空字符串变为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,(如果date总是第四行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
    }'

答案 1 :(得分:1)

试试这个awk解决方案:

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

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

答案 2 :(得分:0)

svnadmin lslocks不是post-lock hook脚本中使用的工具。你真正寻找的是svnlook lock。当您使用svnlook lock时,您不需要处理锁定信息,也不需要对其进行排序。