不要重复自己!,哈哈,好吧,我在试着把我的2 github工作流合并到1中。我尝试了一些东西,但出于某种原因,我总是得到一些奇怪的专栏文章。回顾性地说,我可能是在分配而不是比较变量。我决定不用破译的代码来修饰这个问题。
awk正在以git diff-tree -r --no-commit-id --name-status HEAD | awk -f .github/files/changed.awk的形式运行,没有选项。git diff-tree的输出如下所示
( cat << EOF
A .config/plantuml/theme.puml
M .github/workflows/main.yml
M .github/workflows/plantuml.yml
M README.md
A app/gradle.lockfile
A authn/gradle.lockfile
A docs/README.md
A docs/domain-model/README.md
A docs/domain-model/user.md
A docs/domain-model/user.puml
A docs/domain-model/foo.puml
M settings.gradle.kts
D user.puml
D foo.puml
EOF
) | awk -f file.awk这些都是我想出来的。
$2 ~ /\.puml$/ &&
$2 !~ /(theme|config)\.puml$/ &&
$1 !~ /^D$/ {
changed[++n]=$2
}
END {
for ( i in changed ) result = result " " changed[i]
printf "::set-output name=changed-files::%s\n", result
printf "::warning::changed-files %s\n", result
}输出
::set-output name=changed-files:: docs/domain-model/user.puml docs/domain-model/foo.puml
::warning::changed-files docs/domain-model/user.puml docs/domain-model/foo.puml$2 ~ /\.puml$/ &&
$2 !~ /(theme|config)\.puml$/ &&
$1 ~ /^D$/ {
split($2, fn, ".")
changed[++n]=fn[1] ".svg"
}
END {
for ( i in changed ) result = result " " changed[i]
printf "::set-output name=removed-files::%s\n", result
printf "::warning::removed-files %s\n", result
}输出
::set-output name=removed-files:: user.svg foo.svg
::warning::removed-files user.svg foo.svg这是当前工作流文件,如果有帮助的话。注意:对awk -f的更改是在当前损坏的分支中进行的,我将在完成后删除和压缩。
目标是使输出类似于下面的。我不关心行的顺序,列表中的空格非常重要,因为它可以传递给shell上的git add、git rm和plantuml。
# adding empty lines between just for readability here, comments do nott matter either
::set-output name=changed-files:: docs/domain-model/user.puml docs/domain-model/foo.puml
::warning::changed-files docs/domain-model/user.puml docs/domain-model/foo.puml
::set-output name=removed-files:: user.svg foo.svg
::warning::removed-files user.svg foo.svg你将如何去复制和改进它?
发布于 2021-03-16 20:15:44
通过一些改进,将两个部分合并为一个部分。
$2 ~ /\.puml$/ && $2 !~ /(theme|config)\.puml$/ \
{ if($1 !~ /^D$/) { result1= (result1==""? "" : result1 " ") $2 } else {
split($2, fn, ".")
result2=(result2==""? "" : result2 " ") fn[1] ".svg"
}
}
END {
printf "::set-output name=files::%s\n::warning::%s\n", result1, result1
printf "::set-output name=files::%s\n::warning::%s\n", result2, result2
}发布于 2021-03-18 20:38:31
因此,您有一个输入(或文件,git的结果)。
A .config/plantuml/theme.puml
M .github/workflows/main.yml
M .github/workflows/plantuml.yml
M README.md
A app/gradle.lockfile
A authn/gradle.lockfile
A docs/README.md
A docs/domain-model/README.md
A docs/domain-model/user.md
A docs/domain-model/user.puml
A docs/domain-model/foo.puml
M settings.gradle.kts
D user.puml
D foo.puml和两个 awk脚本,它们对此输入执行类似的(但不同的)操作。
我假设您的目标是减少(尽可能)此脚本的操作。
前两行完全相等:
$2 ~ /\.puml$/ &&
$2 !~ /(theme|config)\.puml$/在此之后,一个脚本对而不是 $2采取行动(我假设这意味着删除)。另一个脚本对补码进行操作,$2是D。可编码为:
{ if ( $1 ~ /^[D]$/ ) then { print "Deleted" } else { print "Changed" } }或者,如果您想要一个更细粒度的选择:
{ if ( $1 ~ /^[D]$/ ) then { print "Deleted" }
if ( $1 ~ /^[MA]$/ ) then { print "Changed" } }将每个文件存储在一个数组中并不是真正需要的,因为您需要的是一个分隔的文件列表。
这可以在循环中为每个输入行完成(内存更少,速度更快):
{ if ( $1 ~ /^[D]$/ ) then { deleted = deleted " " $2 }
if ( $1 ~ /^[A]$/ ) then { changed = changed " " $2 } }当然,匹配可以是一个精确的字符串,而不是regex (更快),而且在更改的情况下,您还需要提取没有扩展名的文件名:
{ if ( $1 == "D" ) then { deleted = deleted " " $2 }
if ( $1 == "A" ) then { sub( /\.[^.]+$/, "", $2 ) ;
changed = changed " " $2 ".svg"
}
}测试所有想法的shell脚本可以是:
#!/bin/bash
a='\
A .config/plantuml/theme.puml
M .github/workflows/main.yml
M .github/workflows/plantuml.yml
M README.md
A app/gradle.lockfile
A authn/gradle.lockfile
A docs/README.md
A docs/domain-model/README.md
A docs/domain-model/user.md
A docs/domain-model/user.puml
A docs/domain-model/foo.puml
M settings.gradle.kts
D user.puml
D foo.puml
'
printf '%s\n' "$a" | awk '
$2 ~ /\.puml$/ &&
$2 !~ /(theme|config)\.puml$/ {
if ( $1 == "D" ) { deleted = deleted " " $2 }
if ( $1 == "A" ) { sub(/\.[^.]+$/, "", $2);
changed = changed " " $2 ".svg"
}
}
END {
printf "::set-output name=removed-files::%s\n", deleted
printf "::warning::removed-files %s\n", deleted
printf "::set-output name=changed-files::%s\n", changed
printf "::warning::changed-files %s\n", changed
}
'https://unix.stackexchange.com/questions/639619
复制相似问题