2010-04-20 8 views
8

j'ai deux ont des arbres de code source presque similaires, mais ne pas accéder au référentiel de code source, donc je suis coincé avec des paquets de libération qui contiennent également de tester les rapports, la documentation, les binaires, etc.Comment différencier uniquement les fichiers source?

la commande diff soutenir que --exclude, mais je voudrais faire quelque chose comme diff -wbur --include='*.c,*.h' tree1 tree2

Je sais que this question est quelque peu liée, mais ne résout pas vraiment mon problème.

points bonus pour ignorer les blocs de changement qui sont complètement dans les commentaires C :)

Répondre

14

Petite modification à un résultat de Google a aidé, dans tree1 a fait find . -name '*.[ch]' -exec diff -wibu {} ../tree2/{} \;

+1

C++ arbres source, essayez '-nom '* .h "-o -name" * .cpp "' dans la commande ci-dessus – mgold

4

Voici un petit script maker patch:

#!/bin/bash 

USAGE="USAGE: $0 <dist dir> <edited dir>" 

[ '--help' == "$1" ] && { echo $USAGE; exit 0; } 
[ 2 -eq $# ] || { echo $USAGE; exit 1; } 

# trim starting './' and trailing /'/ 
original=$(echo $1 | sed 's-^\./--;s-/$--') 
changed=$(echo $2 | sed 's-^\./--;s-/$--') 

[ -d $original ] || { echo "ERROR: Directory $original does not exist" >&2 ; exit 2; } 
[ -d $changed ] || { echo "ERROR: Directory $changed does not exist" >&2; exit 3; } 

#command="ls -l" 
command="diff -Naur" 

find $original -name '*.[ch]' -o -name '*.cpp' | sed 's-^[^/]*/--' | { while read file; do $command $original/$file $changed/$file; done; } 
2

J'exclurais tout ce qui ne correspond pas à .c ou .h. Donc, cela signifie qu'il ne comprendra que les fichiers .c et .h:

diff -x "*.[^ch]" 

Pour moi, il est la meilleure façon de le faire parce que vous utilisez uniquement diff

+0

Cela ne fonctionne pas correctement: il inclut des extensions telles que .cpp, .hxx, .cache et .help – cmaster

0

j'ai proposé une solution plus facile que de trouver à mainteneurs diff , voici le fil: http://lists.gnu.org/archive/html/bug-diffutils/2014-10/msg00000.html

l'idée est de fournir une nouvelle option qui indique diff pour analyser des fichiers qui correspondent à une expression régulière, comme: diff -Nurp --only "*.[hc]" source/ source-new/

Voici les instructions pour patcher diffutils

Clone le repo git clone git://git.savannah.gnu.org/diffutils.git

run bootstrap.sh diffutils dans le répertoire et résoudre les dépendances jusqu'à ce qu'il crée le script ./cofigure

Téléchargez le patch de lien ci-dessus

Appliquer git apply <PATCHFILE>

Configurer et compiler ./configure make

Cela va créer la diff patché dans src/diff

Vive

+0

J'ai ajouté patch qui résout mon problème. ow semble être une bonne réponse pour moi :) – geckos

2

Vous pouvez écrire tous les fichiers à exclure dans un fichier temporaire et le donner à l'argument de diff -X.

find tree1 tree2 -type f -not -name '*.[ch]' >exludes 
diff -wbur tree1 tree2 -X excludes 

Ou simplier (fonctionne Bash):

diff -wbur tree1 tree2 -X <(find tree1 tree2 -type f -not -name '*.[ch]') 

Vous pouvez utiliser des arguments de plusieurs noms si vous avez plus des extensions de nom de fichier:

diff -wbur tree1 tree2 \ 
    -X <(find tree1 tree2 -type f -not -name '*.java' -and -not -name '*.sql')