2010-11-29 28 views
12

Je voudrais rechercher une chaîne dans mes fichiers source avec Ant. (Je voudrais que ma construction échoue au cas où certaines chaînes sont trouvées dans mes fichiers source). Donc, je devrais être capable de rechercher récursivement une certaine chaîne dans un ensemble de fichiers. J'ai déjà trouvé que je peux utiliser loadfile task pour vérifier whether a string pattern is found within one file. Mais cela semble fonctionner seulement avec un seul fichier. D'autre part, replace task fournirait récursivement la recherche et le remplacement. Je suppose que je pourrais faire cela avant de construire et remplacer ma chaîne avec quelque chose qui casserait la construction, mais je me demande s'il existe une solution plus propre?Comment rechercher une chaîne dans des fichiers avec Ant (assurez-vous que certaines chaînes ne se trouvent pas dans les fichiers source)

br, Touko

Répondre

16

Vous pouvez envisager d'utiliser fileset selectors pour le faire. Les sélecteurs vous permettent de choisir les fichiers en fonction du contenu, de la taille, de la possibilité d'édition, etc. Vous pouvez combiner des sélecteurs avec des inclusions et des exclusions basées sur le nom, ou des jeux de motifs.

Voici un exemple. Le second ensemble de fichiers est dérivé du premier, avec un sélecteur qui correspond simplement au contenu du fichier. Pour une correspondance plus sophistiquée, il y a le containsregexp selector. Le résultat est un ensemble de fichiers contenant uniquement les fichiers correspondant à la chaîne. Une tâche d'échec avec un resourcecount condition est ensuite utilisée pour échouer la génération, sauf si cet ensemble de fichiers est vide.

<property name="src.dir" value="src" /> 
<property name="search.string" value="BAD" /> 

<fileset id="existing" dir="${src.dir}"> 
    <patternset id="files"> 
     <!-- includes/excludes for your source here --> 
    </patternset> 
</fileset> 

<fileset id="matches" dir="${src.dir}"> 
    <patternset refid="files" /> 
    <contains text="${search.string}" /> 
</fileset> 

<fail message="Found '${search.string}' in one or more files in '${src.dir}'"> 
    <condition> 
     <resourcecount when="greater" count="0" refid="matches" /> 
    </condition> 
</fail> 

(Old réponse): Si le réglage ou la réutilisation filesets pourrait être problématique, voici une illustration d'une alternative simple relativement.

L'idée est de faire une copie des fichiers, , puis remplacez la chaîne que vous souhaitez rechercher avec une valeur d'indicateur dans les fichiers copiés. Cela mettra à jour la dernière heure modifiée sur tout fichier correspondant. La tâche uptodate peut ensuite être utilisée pour rechercher les fichiers affectés. Enfin, sauf si aucun fichier ne correspond, vous pouvez fail la construction.

<property name="src.dir" value="src" /> 
<property name="work.dir" value="work" /> 
<property name="search.string" value="BAD" /> 

<delete dir="${work.dir}" /> 
<mkdir dir="${work.dir}" /> 
<fileset dir="${src.dir}" id="src.files"> 
    <include name="*.txt" /> 
</fileset> 
<copy todir="${work.dir}" preservelastmodified="true"> 
    <fileset refid="src.files" /> 
</copy> 
<fileset dir="${work.dir}" id="work.files"> 
    <include name="*.txt" /> 
</fileset> 
<replaceregexp match="${search.string}" 
       replace="FOUND_${search.string}"> 
    <fileset refid="work.files" /> 
</replaceregexp> 
<uptodate property="files.clean"> 
    <srcfiles refid="work.files" /> 
    <regexpmapper from="(.*)" to="${basedir}/${src.dir}/\1" /> 
</uptodate> 
<fail message="Found '${search.string}' in one or more files in dir '${src.dir}'" 
     unless="files.clean" /> 
+0

Le premier exemple peut être fait un peu plus en utilisant de façon concise que l'ensemble de fichiers « correspondances » avec un « comprend » attribut, en omettant le imbriqué . –

+1

@EdRandall pouvez-vous poster une réponse avec un exemple s'il vous plaît – Moudiz

1

Cela a été très utile pour commencer, mais j'ai une liste de chaînes qui doivent être vérifiées dans un ensemble de fichiers.

Mon code actuel est-sofar:

<property name="search4" value="XYZ"/> 

<fileset id="existing" dir="../src"> 
    <patternset id="files"> 
    <include name="content/**/*.txt"/> 
    </patternset> 
</fileset> 

<resourcecount property="count"> 
    <fileset id="matches" dir="../src"> 
    <patternset refid="files" /> 
    <contains text="${search4}" /> 
    </fileset> 
</resourcecount> 
<echo message="Found '${search4}' in files : '${count}'"/> 

Cela fonctionne bien, mais comment développer cette sorte que le $ {} search4 est lu à partir d'une liste. En fait, la liste peut être lue à partir d'un fichier contenant chaque élément de recherche sur une ligne distincte.

0

variation légèrement plus concise sur la première partie de la réponse de @ martinclayton:

<property name="log.dir" value="logs" /> 
<property name="fail.string" value=" FAILED " /> 

<fileset id="build.failures" dir="${log.dir}" includes="*.log"> 
    <contains text="${fail.string}"/> 
</fileset> 
<fail status="1" message="One or more failures detected"> 
    <condition> 
     <resourcecount when="greater" count="0" refid="build.failures" /> 
    </condition> 
</fail>