Author: tasiraj Date: Mon Aug 26 14:58:59 2013 New Revision: 189268 URL: http://llvm.org/viewvc/llvm-project?rev=189268&view=rev Log: clang-replace: Delete change description files
Added a command line option "-remove-change-desc-files" that triggers the deletion of the change description files after merging and applying regardless of success. Differential Revision: http://llvm-reviews.chandlerc.com/D1492 Modified: clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp clang-tools-extra/trunk/clang-replace/ApplyReplacements.h clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp clang-tools-extra/trunk/test/clang-replace/basic.cpp clang-tools-extra/trunk/test/clang-replace/conflict.cpp Modified: clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp?rev=189268&r1=189267&r2=189268&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp (original) +++ clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp Mon Aug 26 14:58:59 2013 @@ -34,6 +34,7 @@ namespace replace { llvm::error_code collectReplacementsFromDirectory(const llvm::StringRef Directory, TUReplacements &TUs, + TUReplacementFiles & TURFiles, clang::DiagnosticsEngine &Diagnostics) { using namespace llvm::sys::fs; using namespace llvm::sys::path; @@ -51,6 +52,8 @@ collectReplacementsFromDirectory(const l if (extension(I->path()) != ".yaml") continue; + TURFiles.push_back(I->path()); + OwningPtr<MemoryBuffer> Out; error_code BufferError = MemoryBuffer::getFile(I->path(), Out); if (BufferError) { @@ -218,5 +221,22 @@ bool applyReplacements(const FileToRepla return true; } +bool deleteReplacementFiles(const TUReplacementFiles &Files, + clang::DiagnosticsEngine &Diagnostics) { + bool Success = true; + for (TUReplacementFiles::const_iterator I = Files.begin(), E = Files.end(); + I != E; ++I) { + error_code Error = llvm::sys::fs::remove(*I); + if (Error) { + Success = false; + // FIXME: Use Diagnostics for outputting errors. + errs() << "Error deleting file: " << *I << "\n"; + errs() << Error.message() << "\n"; + errs() << "Please delete the file manually\n"; + } + } + return Success; +} + } // end namespace replace } // end namespace clang Modified: clang-tools-extra/trunk/clang-replace/ApplyReplacements.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/ApplyReplacements.h?rev=189268&r1=189267&r2=189268&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-replace/ApplyReplacements.h (original) +++ clang-tools-extra/trunk/clang-replace/ApplyReplacements.h Mon Aug 26 14:58:59 2013 @@ -21,6 +21,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/system_error.h" #include <vector> +#include <string> namespace clang { @@ -32,6 +33,9 @@ namespace replace { typedef std::vector<clang::tooling::TranslationUnitReplacements> TUReplacements; +/// \brief Collection of TranslationUnitReplacement files. +typedef std::vector<std::string> TUReplacementFiles; + /// \brief Map mapping file name to Replacements targeting that file. typedef llvm::StringMap<std::vector<clang::tooling::Replacement> > FileToReplacementsMap; @@ -47,6 +51,8 @@ FileToReplacementsMap; /// TranslationUnitReplacements. /// \param[out] TUs Collection of all found and deserialized /// TranslationUnitReplacements. +/// \param[out] TURFiles Collection of all TranslationUnitReplacement files +/// found in \c Directory. /// \param[in] Diagnostics DiagnosticsEngine used for error output. /// /// \returns An error_code indicating success or failure in navigating the @@ -54,6 +60,7 @@ FileToReplacementsMap; llvm::error_code collectReplacementsFromDirectory(const llvm::StringRef Directory, TUReplacements &TUs, + TUReplacementFiles &TURFiles, clang::DiagnosticsEngine &Diagnostics); /// \brief Deduplicate, check for conflicts, and apply all Replacements stored @@ -82,6 +89,17 @@ bool mergeAndDeduplicate(const TUReplace bool applyReplacements(const FileToReplacementsMap &GroupedReplacements, clang::SourceManager &SM); +/// \brief Delete the replacement files. +/// +/// \param[in] Files Replacement files to delete. +/// \param[in] Diagnostics DiagnosticsEngine used for error output. +/// +/// \returns \li true If all files have been deleted successfully. +/// \li false If at least one or more failures occur when deleting +/// files. +bool deleteReplacementFiles(const TUReplacementFiles &Files, + clang::DiagnosticsEngine &Diagnostics); + } // end namespace replace } // end namespace clang Modified: clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp?rev=189268&r1=189267&r2=189268&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp (original) +++ clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp Mon Aug 26 14:58:59 2013 @@ -25,6 +25,29 @@ using namespace clang::replace; static cl::opt<std::string> Directory(cl::Positional, cl::Required, cl::desc("<Search Root Directory>")); +static cl::opt<bool> RemoveTUReplacementFiles( + "remove-change-desc-files", + cl::desc("Remove the change description files regardless of successful\n" + "merging/replacing."), + cl::init(false)); + +// Helper object to remove the TUReplacement files (triggered by +// "remove-change-desc-files" command line option) when exiting current scope. +class ScopedFileRemover { +public: + ScopedFileRemover(const TUReplacementFiles &Files, + clang::DiagnosticsEngine &Diagnostics) + : TURFiles(Files), Diag(Diagnostics) {} + + ~ScopedFileRemover() { + deleteReplacementFiles(TURFiles, Diag); + } + +private: + const TUReplacementFiles &TURFiles; + clang::DiagnosticsEngine &Diag; +}; + int main(int argc, char **argv) { cl::ParseCommandLineOptions(argc, argv); @@ -34,9 +57,10 @@ int main(int argc, char **argv) { DiagOpts.getPtr()); TUReplacements TUs; + TUReplacementFiles TURFiles; error_code ErrorCode = - collectReplacementsFromDirectory(Directory, TUs, Diagnostics); + collectReplacementsFromDirectory(Directory, TUs, TURFiles, Diagnostics); if (ErrorCode) { errs() << "Trouble iterating over directory '" << Directory @@ -44,6 +68,12 @@ int main(int argc, char **argv) { return false; } + // Remove the TUReplacementFiles (triggered by "remove-change-desc-files" + // command line option) when exiting main(). + OwningPtr<ScopedFileRemover> Remover; + if (RemoveTUReplacementFiles) + Remover.reset(new ScopedFileRemover(TURFiles, Diagnostics)); + FileManager Files((FileSystemOptions())); SourceManager SM(Diagnostics, Files); Modified: clang-tools-extra/trunk/test/clang-replace/basic.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-replace/basic.cpp?rev=189268&r1=189267&r2=189268&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-replace/basic.cpp (original) +++ clang-tools-extra/trunk/test/clang-replace/basic.cpp Mon Aug 26 14:58:59 2013 @@ -4,3 +4,14 @@ // RUN: sed "s#\$(path)#%/T/Inputs/basic#" %S/Inputs/basic/file2.yaml > %T/Inputs/basic/file2.yaml // RUN: clang-replace %T/Inputs/basic // RUN: FileCheck -input-file=%T/Inputs/basic/basic.h %S/Inputs/basic/basic.h +// +// Check that the yaml files are *not* deleted after running clang-replace without remove-change-desc-files. +// RUN: ls -1 %T/Inputs/basic | FileCheck %s --check-prefix=YAML +// +// Check that the yaml files *are* deleted after running clang-replace with remove-change-desc-files. +// RUN: grep -Ev "// *[A-Z-]+:" %S/Inputs/basic/basic.h > %T/Inputs/basic/basic.h +// RUN: clang-replace -remove-change-desc-files %T/Inputs/basic +// RUN: ls -1 %T/Inputs/basic | FileCheck %s --check-prefix=NO_YAML +// +// YAML: {{^file.\.yaml$}} +// NO_YAML-NOT: {{^file.\.yaml$}} Modified: clang-tools-extra/trunk/test/clang-replace/conflict.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-replace/conflict.cpp?rev=189268&r1=189267&r2=189268&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-replace/conflict.cpp (original) +++ clang-tools-extra/trunk/test/clang-replace/conflict.cpp Mon Aug 26 14:58:59 2013 @@ -5,3 +5,13 @@ // RUN: sed "s#\$(path)#%/S/Inputs/conflict#" %S/Inputs/conflict/expected.txt > %T/Inputs/conflict/expected.txt // RUN: not clang-replace %T/Inputs/conflict > %T/Inputs/conflict/output.txt 2>&1 // RUN: diff -b %T/Inputs/conflict/output.txt %T/Inputs/conflict/expected.txt +// +// Check that the yaml files are *not* deleted after running clang-replace without remove-change-desc-files even when there is a failure. +// RUN: ls -1 %T/Inputs/conflict | FileCheck %s --check-prefix=YAML +// +// Check that the yaml files *are* deleted after running clang-replace with remove-change-desc-files even when there is a failure. +// RUN: not clang-replace %T/Inputs/conflict -remove-change-desc-files > %T/Inputs/conflict/output.txt 2>&1 +// RUN: ls -1 %T/Inputs/conflict | FileCheck %s --check-prefix=NO_YAML +// +// YAML: {{^file.\.yaml$}} +// NO_YAML-NOT: {{^file.\.yaml$}} _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
