class RuleActivityOverview {

  private static final int PAST_DAYS = 365/2;

  RuleActivityOverview() {
  }

  private void run() {<FILL_FUNCTION_BODY>}

  int getActivityFor(Language lang, int pastDays) {
    try {
      Calendar past = GregorianCalendar.getInstance();
      past.add(Calendar.DAY_OF_MONTH, -pastDays);
      SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
      String pastString = dateFormat.format(past.getTime());
      String langCode = lang.getShortCode();
      List<File> xmlFiles = getAllXmlFiles(lang, langCode);
      int commits = 0;
      for (File file : xmlFiles) {
        if (!file.getName().contains("-test-") && !file.exists()) {
          throw new RuntimeException("Not found: " + file);
        }
        String command = "git log --after=" + pastString + " " + file;
        Runtime runtime = Runtime.getRuntime();
        Process process = runtime.exec(command);
        InputStream inputStream = process.getInputStream();
        String output = StringTools.readStream(inputStream, "utf-8");
        process.waitFor();
        commits += getCommits(output);
      }
      return commits;
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  private List<File> getAllXmlFiles(Language lang, String langCode) {
    List<File> files = new ArrayList<>();
    List<String> ruleFileNames = lang.getRuleFileNames();
    for (String ruleFileName : ruleFileNames) {
      files.add(new File("../languagetool-language-modules/" + langCode + "/src/main/resources/" + ruleFileName));
    }
    File disambiguationFile = new File("../languagetool-language-modules/" + langCode +
            "/src/main/resources/org/languagetool/resource/" + langCode + "/disambiguation.xml");
    if (disambiguationFile.exists()) {
      files.add(disambiguationFile);
    }
    return files;
  }

  private int getCommits(String svnOutput) {
    int count = 0;
    try (Scanner scanner = new Scanner(svnOutput)) {
      while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        if (line.startsWith("commit ")) {
          count++;
        }
      }
    }
    return count;
  }

  public static void main(String[] args) throws Exception {
    RuleActivityOverview prg = new RuleActivityOverview();
    prg.run();
  }

}

    System.out.println("Commits per language in the last " + PAST_DAYS + " days");
    System.out.println("Date: " + new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
    
    List<String> sortedLanguages = new ArrayList<>();
    for (Language element : Languages.get()) {
      sortedLanguages.add(element.getName());
    }
    Collections.sort(sortedLanguages);
    for (String langName : sortedLanguages) {
      Language lang = Languages.getLanguageForName(langName);
      int commits = getActivityFor(lang, PAST_DAYS);
      System.out.println(commits + "\t" + lang.getName() + (lang.isVariant() ? " (including the parent language)" : ""));
    }
  
<no_super_class>