我正在尝试使用 awk 从拉取请求中检测 .cls 文件中的 System.debug 语句,不包括在 try/catch 块中找到的语句:
awk '
BEGIN {
IGNORECASE = 1
}
/try\s*{/ {
in_try_block=1
}
/catch\s*\(/ {
in_catch_block=1
}
/}/ {
if (in_catch_block) {
in_catch_block=0
} else if (in_try_block) {
in_try_block=0
}
}
/System\.debug/ && !in_try_block && !in_catch_block {
print "\033[1;31mError: System.debug found in " FILENAME ": Line " NR ": " $0 "\033[0m"
}
' "$file"
效果很好,但是当我在检测到 sytstem.debug 时开始引入失败时,问题就开始了。
我尝试了退出1
/System\.debug/ && !in_try_block && !in_catch_block {
print "\033[1;31mError: System.debug found in " FILENAME ": Line " NR ": " $0 "\033[0m"
exit 1
}
但它会退出并且不会进一步处理system.debugs。然后我引入了增量变量,例如:
/System\.debug/ && !in_try_block && !in_catch_block {
print "\033[1;31mError: System.debug found in " FILENAME ": Line " NR ": " $0 "\033[0m"
i++
}
' "$file"
if [[ i -gt 0 ]]; then
exit 1
fi
但是变量值没有反映。 所以我试图找到将 awk 变量/值传递到 shell 的最短方法。
示例类为:
@isTest
public class GenerateDocumentTest {
public static final String AUTH_PATH = 'Auth Path';
public static final String SAMPLE_DATA = '{"key": "value"}';
@TestSetup
static void setupTestData() {
try {
// Insert test site
insert new Site__c(Active__c = true, Site_Code__c = 'TestCode');
// Insert test contact
insert new Contact(FirstName = 'John', LastName = 'Doe', Email = '[email protected]');
// Insert test account
insert new Account(Name = 'Test Account', Phone = '123456789', Email = '[email protected]');
// Insert test product and pricebook entry
Product2 testProduct = new Product2(Name = 'Sample Product', IsActive = true);
insert testProduct;
insert new PricebookEntry(
Product2Id = testProduct.Id,
Pricebook2Id = Test.getStandardPricebookId(),
UnitPrice = 100,
IsActive = true
);
} catch (Exception ex) {
System.debug('Setup error: ' + ex.getMessage());
}
}
@isTest
static void testDocumentGeneration() {
try {
System.debug('Testing document generation...');
// Add test logic here
} catch (Exception ex) {
System.assert(false, 'Test failed: ' + ex.getMessage());
}
}
}
awk 不是 shell,如果调用 shell 脚本可以访问 awk 变量的值,那么它会是紧密耦合的(即糟糕的软件)。
而不是这个:
awk '
{
print "foo"
i++
}
' file
echo "$i"
这样做:
i=$(awk '
{
print "foo" >"/dev/stderr"
i++
}
END { print i+0 }
' file)
echo "$i"