ফর্ম্যাটিং পার্থক্য উপেক্ষা করে উত্স কোড ফাইলগুলি তুলনা করুন (যেমন সাদা স্থান, লাইনব্রেকস,…)


9

আমি এমন একটি অ্যাপ্লিকেশন খুঁজছি যা দুটি সি ++ উত্সের সাথে তুলনা করতে পারে এবং কোড-অর্থপূর্ণ পার্থক্যগুলি খুঁজে পেতে পারে (সংস্করণগুলির তুলনায় তুলনা করতে পারে যা আলাদাভাবে পুনরায় ফর্ম্যাট করা হয়েছে)। খুব কমপক্ষে, এমন কিছু যা শ্বেত স্থান, ট্যাব স্পেস এবং নিউলাইনগুলির উত্সের কার্যকারিতা প্রভাবিত করে না এমন পরিবর্তনগুলিকে অগ্রাহ্য করার ক্ষমতা রাখে (দ্রষ্টব্য যে একটি নতুন লাইন হোয়াইটস্পেস হিসাবে বিবেচিত হয় কিনা তা ভাষা-নির্ভর , এবং সি এবং সি ++ এটি করে )। এবং, আদর্শভাবে এমন কিছু যা সঠিকভাবে সমস্ত কোড-অর্থপূর্ণ পার্থক্য চিহ্নিত করতে পারে। আমি উবুন্টু এর অধীনে আছি

অনুযায়ী diff --help | grep ignore, আমি আশা diff -bBwZকরতে যুক্তিসঙ্গতভাবে কাজ (আমি, কিছু মিথ্যা নেগেটিভ পেতে পরে মোকাবেলা হবে বলে আশা করা)। তবুও তা হয় না doesn't

যদি স্নিপেট সহ আমার নিচের ফাইলগুলি থাকে

test_diff1.txt

    else if (prop == "P1") { return 0; }

এবং test_diff2.txt

    else if (prop == "P1") {
        return 0;
    }

তারপর

$ diff -bBwZ test_diff1.txt test_diff2.txt
1c1,3
<     else if (prop == "P1") { return 0; }
---
>     else if (prop == "P1") {
>         return 0;
>     }

পরিবর্তে খালি ফলাফল।

উভয় ইনপুটগুলিতে "ফিল্টার" হিসাবে একটি কোড ফর্ম্যাটর ব্যবহার করলে এই পার্থক্যগুলি ফিল্টার হয়ে যায়, তবে তারপরে ফলাফলটি আউটপুটটিকে আসল পাঠ্য এবং লাইন সংখ্যা রাখতে পার্থক্যের চূড়ান্ত প্রতিবেদনের জন্য মূল ইনপুটগুলিতে ফিরে বেঁধে রাখতে হবে। সুতরাং সঠিকভাবে একটি সংকলকের প্রয়োজন ছাড়াই উদ্দেশ্যটি অর্জনযোগ্য ... যদিও কিছু পাওয়া যায় তা আমি জানি না।

উদ্দেশ্য কি অর্জন করা যায় diff? অন্যথায়, বিকল্প আছে (অগ্রাধিকার হিসাবে, কমান্ড লাইনের জন্য)?

উত্তর:


6

আপনি ব্যবহার করতে পারেন dwdiff। থেকে man dwdiff:

dwdiff - একটি সীমিত শব্দ পার্থক্য প্রোগ্রাম

প্রোগ্রামটি খুব চালাক - দেখুন dwdiff --help:

$ dwdiff --help
Usage: dwdiff [OPTIONS] <OLD FILE> <NEW FILE>
-h, --help                             Print this help message
-v, --version                          Print version and copyright information
-d <delim>, --delimiters=<delim>       Specify delimiters
-P, --punctuation                      Use punctuation characters as delimiters
-W <ws>, --white-space=<ws>            Specify whitespace characters
-u, --diff-input                       Read the input as the output from diff
-S[<marker>], --paragraph-separator[=<marker>]  Show inserted or deleted blocks
                               of empty lines, optionally overriding the marker
-1, --no-deleted                       Do not print deleted words
-2, --no-inserted                      Do not print inserted words
-3, --no-common                        Do not print common words
-L[<width>], --line-numbers[<width>]   Prepend line numbers
-C<num>, --context=<num>               Show <num> lines of context
-s, --statistics                       Print statistics when done
--wdiff-output                         Produce wdiff compatible output
-i, --ignore-case                      Ignore differences in case
-I, --ignore-formatting                Ignore formatting differences
-m <num>, --match-context=<num>        Use <num> words of context for matching
--aggregate-changes                    Allow close changes to aggregate
-A <alg>, --algorithm=<alg>            Choose algorithm: best, normal, fast
-c[<spec>], --color[=<spec>]           Color mode
-l, --less-mode                        As -p but also overstrike whitespace
-p, --printer                          Use overstriking and bold text
-w <string>, --start-delete=<string>   String to mark begin of deleted text
-x <string>, --stop-delete=<string>    String to mark end of deleted text
-y <string>, --start-insert=<string>   String to mark begin of inserted text
-z <string>, --stop-insert=<string>    String to mark end of inserted text
-R, --repeat-markers                   Repeat markers at newlines
--profile=<name>                       Use profile <name>
--no-profile                           Disable profile reading

এটি দিয়ে পরীক্ষা করুন:

cat << EOF > test_diff1.txt
    else if (prop == "P1") { return 0; }
EOF

cat << EOF > test_diff2.txt
    else if (prop == "P1") {
        return 0;
    }
EOF

তারপরে তুলনা লঞ্চ করুন:

$ dwdiff test_diff1.txt test_diff2.txt --statistics
    else if (prop == "P1") {
        return 0;
    }
old: 9 words  9 100% common  0 0% deleted  0 0% changed
new: 9 words  9 100% common  0 0% inserted  0 0% changed

100% commonউপরে দয়া করে নোট করুন ।


1

আমি সন্দেহ করি এটি এমন কিছু যা পার্থক্য করতে পারে। যদি কোনও লাইনের মধ্যে স্থান পরিবর্তন হয়, তবে এটি কাজ করবে (বা অন্যান্য অনুরূপ প্রোগ্রাম যেমন কোম্পারে)। আরও খারাপ, আপনি অনুসন্ধান-এবং-প্রতিস্থাপন এবং ট্যাব অক্ষরগুলি ধস করতে পারেন, ইত্যাদি But তবে আপনি কী এক লাইন ছাড়িয়ে সাদা স্থান পরিবর্তন করতে চাইছেন ...

আপনার এমন একটি প্রোগ্রাম প্রয়োজন যা সি ++ ভাষা বোঝে। মনে রাখবেন যে সমস্ত ভাষা আলাদা এবং বিশেষত পাইথন কোড ব্লক সংজ্ঞায়িত করতে হোয়াইটস্পেস ব্যবহার করে। এরূপ হিসাবে, আমার সন্দেহ হয় যে কোনও সাধারণ ভিন্ন মত প্রোগ্রাম "কোন" (বা একটি নির্দিষ্ট) প্রোগ্রামিং ভাষার সাথে কাজ করবে।

আপনি দুটি উত্স ফাইলের মধ্যে যেতে কোনও ধরণের পার্সার বিবেচনা করতে পারেন এবং তারপরে এই পার্সারের আউটপুটগুলি তুলনা করতে পারেন।

এটি আমার পটভূমির বাইরে, তবে আমি আপনাকে লেক্স এবং ইয়্যাক সন্ধান করার পরামর্শ দিচ্ছি । এগুলি উইকিপিডিয়া পৃষ্ঠা; আপনি এই পৃষ্ঠাটি একবারে দেখতে চান যা একটি সংক্ষিপ্ত ব্যাখ্যা এবং একটি উদাহরণ দেয়।


আমি মনে করি না যে আমার বিশেষত সি ++ বোঝার জন্য এমন কিছু দরকার (কমপক্ষে নতুন লাইনের কারণে পার্থক্য উপেক্ষা করার জন্য), আমার উত্সগুলি সংকলন করার দরকার নেই। ভাষা কেবল নির্বিশেষে এর যথাযথভাবে পৃথক হওয়া দরকার। সেখানে আরও একটি উত্তর রয়েছে যা ডাবডিফের পরামর্শ দেয়। এখনও এটি পরীক্ষা করতে হবে, তবে প্রদত্ত উদাহরণটি বিশ্বাসযোগ্য মনে হচ্ছে।
sancho.s পুনরায় ইনস্টল করুন মনিকাসেলিও

Lex / Yacc উত্স কোডটি কম্পাইল করে না, প্রতি সে। এটি টোকেনগুলিতে পৃথক করবে। উদাহরণস্বরূপ, আপনার যদি "int foo = 0" বনাম "int বার = 0" থাকে তবে স্পষ্টভাবে foo এবং বার দুটি পৃথক শব্দ; তবে একটি প্রোগ্রামের প্রসঙ্গে, তারা আসলে অভিন্ন। আপনি যদি এর মতো মিল ধরতে চান তবে আপনার একধরণের পার্সার লাগতে পারে। যদি আপনি তা না করেন, তবে সত্যই, দ্বিপাক্ষিক পরামর্শটি খুব ভাল একটি বলে মনে হচ্ছে। শুভকামনা!
রায়

0

অনুরূপ পরিস্থিতিতে, যখন আমাকে gitকোড-ফর্ম্যাটিং অজ্ঞেহিত পদ্ধতিতে দুটি শাখার তুলনা করার দরকার হয়েছিল , আমি এটি করেছি:

  1. অস্থায়ী শাখা তৈরি করেছে:

    $ git co feature-a
    $ git co -b 1
    $ git co feature-b
    $ git co -b 2
    
  2. উভয় শাখা ফর্ম্যাট করে ব্যবহার করে clang-format:

    $ git co 1
    $ find . -name '*.cpp' -print0 | parallel -0 -n 1 clang-format -i -style=google
    $ git ci -a -m1 --no-verify
    $ git co 2
    $ find . -name '*.cpp' -print0 | parallel -0 -n 1 clang-format -i -style=google
    $ git ci -a -m2 --no-verify
    
  3. প্রকৃত তুলনা করেছেন:

    $ git diff -w -b 1 2
    

    ( -w -bকেবলমাত্র ক্ষেত্রে আপনাকে স্থানের পার্থক্য উপেক্ষা করার অনুমতি দেয়)।

আপনি পছন্দ করতে পারেন uncrustifyউপর clang-format( uncrustify'র mod_full_brace_ifএকক লাইন প্রায় কোঁকড়া ধনুর্বন্ধনী ঢোকানো / বের জোরদার করা ব্যবহৃত হতে পারে ifগুলি শরীর')।

এছাড়াও, যদি জিএনইউ parallelইনস্টল না থাকে তবে ব্যবহার করুন xargs- এটি একই রকম হয় তবে কিছুটা দীর্ঘ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.