Author Topic: Scripted Plugin: FindBrokenFiles  (Read 23891 times)

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9694
Scripted Plugin: FindBrokenFiles
« on: June 13, 2007, 11:17:47 pm »
Some time back I had developed a scripted plugin just for my personal experience. Today I found this within the many folders on my HDD by accident and I think it's worth sharing for people that are interested in such kind of plugins. Take it as an excercise...

What does it do? It searches within a project for broken files - thus, files that are part of the project but do no longer exist on the drive. It shows a list of these files and offers to remove them from the project. Now what is so special about that? Nothing, except this is a scripted plugin. Never heard of such? C::B offers so much more that you can ever imagine... ;-) Scripted plugins use the scripting engine inside C::B and the exposed parts of the C::B SDK to be nearly as powerful as "binary" plugins but do require *no* compilation.

So what do you have to do? Read the documentation about scripting in the WiKi. Install the plugin as following:
- create a file named "find_broken_files.script"
- copy the content of the file (as shown below in the attachment) within this file
- put the file (which already is the ready-to-use plugin!) into: [C::B]\share\CodeBlocks\scripts
- open the startup.script file in the very same folder
- add the line: Include(_T("find_broken_files.script")); just where the comments state to do so
- restart C::B, open a project and right-click on it in the project tree
- notice the new menu entry "Find broken files in project"
- inspect the scripted plugin again to understand it's "magic" - it's very simple!

With regards, Morten.

Attachment (file "find_broken_files.script"):
Code
//
// Script that searches inside a project for invalid (broken) files
// Created by MortenMacFly for Code::Blocks IDE (www.codeblocks.org)
//

class FindBrokenFilesPlugin extends cbScriptPlugin
{
  // mandatory to setup the plugin's info
  constructor()
  {
    info.name = _T("Find Broken Files plugin");
    info.title = _T("Find Broken Files");
    info.version = _T("0.9");
    info.license = _T("GPL");
  }

  // create menubar items
  function GetMenu()
  {
    local entries = ::wxArrayString();
    entries.Add(_T("Project/-Find broken files in project"), 1);
    return entries;
  }

  // create context menu entries
  function GetModuleMenu(who, data)
  {
    local entries = ::wxArrayString();

    if (who == ::mtProjectManager)
      entries.Add(_T("Find broken files in project"), 1);

    return entries;
  }

  // support ExecutePlugin(pluginNameString)
  function Execute()
  {
    // try to open the project manager
    local pm = GetProjectManager();

    // display a message if project manager could not be located
    if (IsNull(pm))
    {
      ShowError(_T("Could not query the project manager. Cannot continue."));
      return 0;
    }

    // try to query the currently active project (which we will analyse)
    local p = pm.GetActiveProject();

    // display a message if there is no active project
    if (IsNull(p))
    {
      ShowError(_T("Currently no project is loaded/activated. Cannot continue."));
      return 0;
    }

    // verify that there are files in the project to analyse
    local files_count = p.GetFilesCount();

    // display a message if the project contains no files
    if (files_count<1)
    {
      ShowError(_T("The active project contains no files. Cannot continue."));
      return 0;
    }
    //else
    //  ShowInfo(_T("The active project has ") + files_count + _T(" files."));

    // search for broken files
    local broken_files = 0;
    local broken_files_str = _T("");
    for (local i=0; i<files_count; i++)
    {
      local pf = p.GetFile(i);
      if (IsNull(pf))
      {
        ShowError(_T("Could not access project file(s). Cannot continue."));
        return 0;
      }

      local full_path = pf.file.GetFullPath(::wxPATH_NATIVE);
      if (!IO.FileExists(full_path))
      {
        broken_files++;
        broken_files_str = broken_files_str + full_path + _T("\n");
      }
    }

    // operate broken files (if any)
    if (broken_files>0)
    {
      ShowInfo(_T("The project has ") + broken_files + _T(" broken files:\n") + broken_files_str);

      local msg   = _T("Do you want to remove them from the project now?");
      local remove_files = Message(msg, _T("Broken Files Plugin"), ::wxICON_QUESTION | ::wxYES_NO);
      if (remove_files==::wxID_YES)
      {
        // search for broken files again and remove them from the project
        local removed_files = 0;
        for (local i=0; i<files_count; i++)
        {
          local pf = p.GetFile(i-removed_files);
          if (IsNull(pf))
          {
            ShowError(_T("Could not access project file(s). Cannot continue."));
            return 0;
          }

          local full_path = pf.file.GetFullPath(::wxPATH_NATIVE);
          if (!IO.FileExists(full_path))
          {
            if (p.RemoveFile(i-removed_files))
            {
              removed_files++;
              files_count--;
            }
          }
        }
        pm.RebuildTree();
        ShowInfo(_T("Operation successfully completed.\n") + removed_files + _T(" files have been removed."));
      }
      else
        ShowInfo(_T("Operation cancelled."));
    }
    else
      ShowInfo(_T("In this project no broken files were found."));

    return 0;
  }

  // callback for menubar items clicking
  function OnMenuClicked(index)
  {
    local result = Execute();
  }

  // callback for context menu items clicking
  function OnModuleMenuClicked(index)
  {
    local result = Execute();
  }
}

// this call actually registers the script plugin with Code::Blocks
RegisterPlugin(FindBrokenFilesPlugin());

Edit1: Fixed a little bug in the script on behalf of killerbot...
Edit2: Fixed another bug that wouldn't allow to remove the duplicate files
« Last Edit: July 10, 2007, 05:43:25 pm by MortenMacFly »
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5491
Re: Scripted Plugin: FindBrokenFiles
« Reply #1 on: June 13, 2007, 11:21:51 pm »
great :-)
Thumbs up !!!

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9694
Re: Scripted Plugin: FindBrokenFiles
« Reply #2 on: June 13, 2007, 11:33:54 pm »
great :-)
Hehe... this actually came into my mind when I saw your changes with r4093. This *could* have been done similarly by a script(ed plugin), too.  (Although it surely makes more sense in the SDK). ;-)
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #3 on: December 29, 2011, 04:46:17 pm »
here is an adaptation for r7639

Code
local full_path = pf.file.GetFullPath(::wxPATH_NATIVE);
          if (!IO.FileExists(full_path))
          {
//-->  LETARTARE for r7639
          //  if (p.RemoveFile(i-removed_files))
       if (p.RemoveFile(pf))
//<-- LETARTARE
            {
              removed_files++;
              files_count--;
            }
          }
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Re: Scripted Plugin: FindBrokenFiles
« Reply #4 on: December 29, 2011, 05:05:57 pm »
Morten: Have you thought of putting this in svn?
Also have you tried to put a menu entry in Plugins instead of the context menu of the project, something like "Plugins->Find broken files"?
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #5 on: December 29, 2011, 05:09:51 pm »
yes it would be a good idea.
adaptation is easy.
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9694
Re: Scripted Plugin: FindBrokenFiles
« Reply #6 on: December 29, 2011, 06:01:41 pm »
Morten: Have you thought of putting this in svn?
Both of you: Have you seen that this post is dated back to 2007? Teodor: You can safely apply it if its still working... I don't know, if that's still the case.
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #7 on: December 29, 2011, 06:05:44 pm »
I use it very often.
This is a great utility.
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Re: Scripted Plugin: FindBrokenFiles
« Reply #8 on: December 29, 2011, 06:33:25 pm »
It doesn't work for me. It fails on GetFile, LETARTARE, do I need some scripting patch in order to make it work?
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #9 on: December 29, 2011, 06:40:00 pm »
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Re: Scripted Plugin: FindBrokenFiles
« Reply #10 on: December 29, 2011, 06:55:42 pm »
Uf, I had to update my working copy :(
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #11 on: December 29, 2011, 07:06:02 pm »
It works fine with release 10.05 (new 'find_broken_files.script)
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Re: Scripted Plugin: FindBrokenFiles
« Reply #12 on: December 29, 2011, 09:02:25 pm »
OK, I've committed it to trunk...
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9694
Re: Scripted Plugin: FindBrokenFiles
« Reply #13 on: December 30, 2011, 07:50:15 am »
OK, I've committed it to trunk...
BTW: Reminds me: I had an issue with this script the past time I used it: When removing files, some were left and you had to call the script several times to really remove all broken files. Is that still the case?
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Re: Scripted Plugin: FindBrokenFiles
« Reply #14 on: December 30, 2011, 09:58:23 am »
I've tried it on the codeblocks-unix.cbp and it removed one file successfully :)
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline Jenna

  • Administrator
  • Lives here!
  • *****
  • Posts: 7255
Re: Scripted Plugin: FindBrokenFiles
« Reply #15 on: December 30, 2011, 10:22:41 am »
OK, I've committed it to trunk...
BTW: Reminds me: I had an issue with this script the past time I used it: When removing files, some were left and you had to call the script several times to really remove all broken files. Is that still the case?
Yes it is.

The cause is that you loop forward through the files and remove them.

In general it's better to do this backwards if removing array members, because a removed index does not change the indexes following in the loop.

I fixed it in trunk and now it seems to work as expected.

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9694
Re: Scripted Plugin: FindBrokenFiles
« Reply #16 on: December 30, 2011, 11:02:25 am »
I've tried it on the codeblocks-unix.cbp and it removed one file successfully :)
Note that this might not really be a missing file. some of the files are Windows only and are simple "disabled" in Unix.
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline MortenMacFly

  • Administrator
  • Lives here!
  • *****
  • Posts: 9694
Re: Scripted Plugin: FindBrokenFiles
« Reply #17 on: December 30, 2011, 11:04:05 am »
In general it's better to do this backwards if removing array members, because a removed index does not change the indexes following in the loop.
I know, but it was really just a demo and I was to lazy to take care.

I fixed it in trunk and now it seems to work as expected.
Thanks! :)
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: https://www.codeblocks.org/docs/main_codeblocks_en.html
C::B FAQ: https://wiki.codeblocks.org/index.php?title=FAQ

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #18 on: January 02, 2012, 09:49:57 am »
Good year for C::B.
@jens
r7650 in 'src/scripts/plugin_find_broken_files.script',
line of code:
Quote
entries.Add(_T("Plugins/0:-Find broken files in project"), 1);
creates an entry 'Plugins' in the international versions !
I propose instead
Quote
entries.Add(_("&Plugins") + _T("/0:-") + _("Find broken files in project"), 1) ;
which also allows the translation.

Other hand, all the scripts in this directory can be prepared for the translation, I can send
a zip of changed files and 'scripts.pot', that works at home.

CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Re: Scripted Plugin: FindBrokenFiles
« Reply #19 on: January 02, 2012, 05:08:15 pm »
As far as I can see you've not tested the change, have you?
I think so, because the correct line is:
Code
entries.Add(_("P&lugins") + _T("/0:-") + _("Find broken files in project"), 1);

Please verify my version of the line is correct and I'll commit it.

(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #20 on: January 02, 2012, 05:26:27 pm »
I tested and it works with my setup !
In r7650 (English) with '&Plugins', 'P&lugins', 'Plugins' it works !!
and French works as.
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Re: Scripted Plugin: FindBrokenFiles
« Reply #21 on: January 02, 2012, 05:36:28 pm »
So what is the correct line? Your last post is quite confusing.
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #22 on: January 02, 2012, 05:39:29 pm »
The '&' is not taken into account.
Take 'Plugins' as 'Jens'.
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #23 on: January 02, 2012, 06:43:39 pm »
r7650 : In the source 'src\main.cpp:926'  found  _('P&lugins').
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl

Offline oBFusCATed

  • Developer
  • Lives here!
  • *****
  • Posts: 13413
    • Travis build status
Re: Scripted Plugin: FindBrokenFiles
« Reply #24 on: January 02, 2012, 08:49:17 pm »
Yes, I know, that's why I've said that you've not tested your change, but if it doesn't matter I'll commit a version without the '&' character.
(most of the time I ignore long posts)
[strangers don't send me private messages, I'll ignore them; post a topic in the forum, but first read the rules!]

Offline LETARTARE

  • Lives here!
  • ****
  • Posts: 531
  • L'ami de l'homme.The friend of man.
    • LETARTARE
Re: Scripted Plugin: FindBrokenFiles
« Reply #25 on: January 03, 2012, 08:48:23 am »
@ofuscated
I am sorry but I tested all the possibilities on r7650, before posting:
Quote
'Plugins'
Quote
'&Plugins'
Quote
'P&lugins'

all work on my computer!

In addition, the menus, letters preceded by '&' are no different from others letters.
CB-13483, plugins-sdk-2.25.0 : Collector-2.0.0, AddOnForQt-3.9.1
1-Win7 Business Pack1 64bits : wx-3.2.4, gcc-8.1.0,
2-OpenSuse::Leap-15.4-64bits : wx-3.2.4;gtk3, gcc-8.2.1,
=> !! The messages are translated by Deepl